diff --git a/doc/(pesonnal notes) b/doc/(pesonnal notes)
index 89e58c7..9a4eaa4 100644
--- a/doc/(pesonnal notes)
+++ b/doc/(pesonnal notes)
@@ -4,6 +4,14 @@ https://thevaluable.dev/sed-cli-practical-guide-examples/#the-basics-of-sed
********************************************************************************
+/**
+ * Comment gerer l'image du curseur ?
+ * https://docs.gtk.org/gdk4/class.Cursor.html TODO
+ */
+
+
+********************************************************************************
+
/*
printf("voir à la fin de 'main: étude des limites de la fonction 'snprintf()'\n");
diff --git a/doc/Doxyfile b/doc/Doxyfile
index 6ef163f..67fc292 100644
--- a/doc/Doxyfile
+++ b/doc/Doxyfile
@@ -1,5 +1,28 @@
# Doxyfile 1.9.8
+#---------------------------------------------------------------------------
+# Configuration options related to:
+# - 51 - project definition (... PROJECT_NAME = "Gem-graph" ...)
+# - 534 - doc building (... EXTRACT_ALL = NO ...)
+# - 855 - warning and progress messages (QUIET = NO)
+# - 961 - input files (INPUT = ./)
+# - 1149 - source browsing (To get rid of source code:
+# SOURCE_BROWSER = NO + VERBATIM_HEADERS = NO)
+# - 1235 - alphabetical class index (ALPHABETICAL_INDEX = YES)
+# - 1255 - HTML output (GENERATE_HTML = NO)
+# - 1901 - LaTeX output (GENERATE_LATEX = YES)
+# - 2084 - RTF output (GENERATE_RTF = NO)
+# - 2140 - man page output (GENERATE_MAN = YES)
+# - 2184 - XML output (GENERATE_XML = NO)
+# - 2218 - DOCBOOK output (GENERATE_DOCBOOK = YES)
+# - 2236 - AutoGen Definitions output (experimental)
+# - 2248 - Sqlite3 output (GENERATE_SQLITE3 = YES)
+# - 2274 - Perl module output (experimental)
+# - 2312 - preprocessor (ENABLE_PREPROCESSING = YES)
+# - 2391 - external references (using TAGFILES)
+# - 2437 - diagram generator tools (if HAVE_DOT = YES)
+#---------------------------------------------------------------------------
+
# This file describes the settings to be used by the documentation system
# doxygen (www.doxygen.org) for a project.
#
@@ -507,7 +530,7 @@ NUM_PROC_THREADS = 1
TIMESTAMP = NO
#---------------------------------------------------------------------------
-# Build related configuration options
+# Documentation building related configuration options
#---------------------------------------------------------------------------
# If the EXTRACT_ALL tag is set to YES, doxygen will assume all entities in
@@ -933,7 +956,7 @@ WARN_LINE_FORMAT = "at line $line of file $file"
WARN_LOGFILE =
-#--------------------------------------------------------------------------
+#---------------------------------------------------------------------------
# Configuration options related to the input files
#---------------------------------------------------------------------------
@@ -964,6 +987,7 @@ INPUT_ENCODING = UTF-8
# "INPUT_ENCODING" for further information on supported encodings.
INPUT_FILE_ENCODING =
+
# If the value of the INPUT tag contains directories, you can use the
# FILE_PATTERNS tag to specify one or more wildcard patterns (like *.cpp and
# *.h) to filter out the source-files in the directories.
@@ -1014,7 +1038,7 @@ EXCLUDE_SYMLINKS = NO
# Note that the wildcards are matched against the file with absolute path, so to
# exclude all test directories for example use the pattern */test/*
-EXCLUDE_PATTERNS =
+EXCLUDE_PATTERNS = */latex/* */html/*
# The EXCLUDE_SYMBOLS tag can be used to specify one or more symbol names
# (namespaces, classes, functions, etc.) that should be excluded from the
@@ -1204,7 +1228,7 @@ USE_HTAGS = NO
# See also: Section \class.
# The default value is: YES.
-VERBATIM_HEADERS = YES
+VERBATIM_HEADERS = NO
#---------------------------------------------------------------------------
# Configuration options related to the alphabetical class index
@@ -1233,7 +1257,7 @@ IGNORE_PREFIX =
# If the GENERATE_HTML tag is set to YES, doxygen will generate HTML output
# The default value is: YES.
-GENERATE_HTML = YES
+GENERATE_HTML = NO
# The HTML_OUTPUT tag is used to specify where the HTML docs will be put. If a
# relative path is entered the value of OUTPUT_DIRECTORY will be put in front of
@@ -1241,7 +1265,7 @@ GENERATE_HTML = YES
# The default directory is: html.
# This tag requires that the tag GENERATE_HTML is set to YES.
-HTML_OUTPUT = html
+HTML_OUTPUT = doc/html
# The HTML_FILE_EXTENSION tag can be used to specify the file extension for each
# generated HTML page (for example: .htm, .php, .asp).
@@ -1887,7 +1911,7 @@ GENERATE_LATEX = YES
# The default directory is: latex.
# This tag requires that the tag GENERATE_LATEX is set to YES.
-LATEX_OUTPUT = latex
+LATEX_OUTPUT = doc/latex
# The LATEX_CMD_NAME tag can be used to specify the LaTeX command name to be
# invoked.
@@ -2119,7 +2143,7 @@ RTF_EXTENSIONS_FILE =
# classes and files.
# The default value is: NO.
-GENERATE_MAN = NO
+GENERATE_MAN = YES
# The MAN_OUTPUT tag is used to specify where the man pages will be put. If a
# relative path is entered the value of OUTPUT_DIRECTORY will be put in front of
@@ -2128,7 +2152,7 @@ GENERATE_MAN = NO
# The default directory is: man.
# This tag requires that the tag GENERATE_MAN is set to YES.
-MAN_OUTPUT = man
+MAN_OUTPUT = doc/rtfm
# The MAN_EXTENSION tag determines the extension that is added to the generated
# man pages. In case the manual section does not start with a number, the number
@@ -2153,7 +2177,7 @@ MAN_SUBDIR =
# The default value is: NO.
# This tag requires that the tag GENERATE_MAN is set to YES.
-MAN_LINKS = NO
+MAN_LINKS = YES
#---------------------------------------------------------------------------
# Configuration options related to the XML output
@@ -2197,7 +2221,7 @@ XML_NS_MEMB_FILE_SCOPE = NO
# that can be used to generate PDF.
# The default value is: NO.
-GENERATE_DOCBOOK = NO
+GENERATE_DOCBOOK = YES
# The DOCBOOK_OUTPUT tag is used to specify where the Docbook pages will be put.
# If a relative path is entered the value of OUTPUT_DIRECTORY will be put in
@@ -2205,7 +2229,7 @@ GENERATE_DOCBOOK = NO
# The default directory is: docbook.
# This tag requires that the tag GENERATE_DOCBOOK is set to YES.
-DOCBOOK_OUTPUT = docbook
+DOCBOOK_OUTPUT = doc/docbook
#---------------------------------------------------------------------------
# Configuration options for the AutoGen Definitions output
@@ -2235,7 +2259,7 @@ GENERATE_SQLITE3 = NO
# The default directory is: sqlite3.
# This tag requires that the tag GENERATE_SQLITE3 is set to YES.
-SQLITE3_OUTPUT = sqlite3
+SQLITE3_OUTPUT = doc/sqlite3
# The SQLITE3_OVERWRITE_DB tag is set to YES, the existing doxygen_sqlite3.db
# database file will be recreated with each doxygen run. If set to NO, doxygen
diff --git a/doc/Readme b/doc/Readme
index bb45864..7e7cdeb 100644
--- a/doc/Readme
+++ b/doc/Readme
@@ -47,13 +47,12 @@ Attention
* @brief
* @details
* @date
- * @dir
- * @file
+ * @author
* @callgraph
- * @see (liste des fonctions qui dépendent de cette fonction)
+ * @see (liste des fonctions appelées par cette fonction)
* @callergraph
- * @see (liste des fonctions dont cette fonction dépend)
- * @param
+ * @see (liste des fonctions qui appellent cette fonction)
+ * @param (liste des paramètres)
* @return
autres (à envisager) @see https://www.doxygen.nl/manual/commands.html
@@ -71,7 +70,6 @@ sed -i 's/phantom documentation used to test the functioning of doxygen/\n
./src/main.c < or any other file...
NB signal et journal n'ont pas été 'tagués' <<<<<<<<<<
-
--------------------------------------------------------------------------------
@@ -165,7 +163,7 @@ NB signal et journal n'ont pas été 'tagués' <<<<<<<<<<
*
*
*
- * Le 2024-10-05), seules trois fonctions ne sont pas nommées selon ces règles:
+ * Le 2024-10-05, seules trois fonctions ne sont pas nommées selon ces règles:
* > create_axis_slider, free_stack_slot, free_stack_slot_size <
*
* et les noms de cinq autres pourraient être améliorés.
diff --git a/doc/docbook/annotated.xml b/doc/docbook/annotated.xml
new file mode 100644
index 0000000..910ca41
--- /dev/null
+++ b/doc/docbook/annotated.xml
@@ -0,0 +1,34 @@
+
+
+Class List
+Here are the classes, structs, unions and interfaces with brief descriptions: arrow_t
+Phantom documentation used to test the functioning of doxygen
+ dblist
+Phantom documentation used to test the functioning of doxygen
+ elem
+Phantom documentation used to test the functioning of doxygen
+ fsm_struct_journal
+Phantom documentation used to test the functioning of doxygen
+ fsm_struct_journal_unit
+Phantom documentation used to test the functioning of doxygen
+ fsm_struct_list_data
+Phantom documentation used to test the functioning of doxygen
+ fsm_struct_list_disp
+Phantom documentation used to test the functioning of doxygen
+ fsm_struct_list_tool
+Phantom documentation used to test the functioning of doxygen
+ graphics_stack_t
+Structure describing a gl_area and its parameters, used to create a table of Gem-graph client current gl_areas
+ pile
+Phantom documentation used to test the functioning of doxygen
+ preferences
+Use this ? static const char *icon_name [3] = { "document-revert-rtl-symbolic", "edit-undo-symbolic", "view-refresh-symbolic" };
+ slist
+Phantom documentation used to test the functioning of doxygen
+ Stack
+Struct images_bff {GtkWidget *arr[MAX_SIZE]; int top;}; static struct images_bff *my_list = NULL;//, *babar = NULL; static struct images_bff *alloc_images_bff () { struct images_bff *p; p = malloc (sizeof (struct images_bff)); if (p == NULL) printf ("fatal: ran out of storage"); p->arr[MAX_SIZE] = NULL; p->top = 0; return p; } static void add_to_mylist (int my_int) { struct images_bff *p = alloc_images_bff (); p->arr[MAX_SIZE] = NULL; // TODO p->top = my_int; my_list = p; } static void free_intlist (struct images_bff *p) { TODO } TODO free_intlist (mylist); TODO mylist = NULL; TODO offsetof (type, field)
+ stack_index_t
+Phantom documentation used to test the functioning of doxygen
+ TreeNode_t
+Phantom documentation used to test the functioning of doxygen
+
diff --git a/doc/docbook/d0/d09/main_8c.xml b/doc/docbook/d0/d09/main_8c.xml
new file mode 100644
index 0000000..2322c97
--- /dev/null
+++ b/doc/docbook/d0/d09/main_8c.xml
@@ -0,0 +1,145 @@
+
+
+src/main.c File Reference
+src/main.c
+
+
+Gem-graph client Main functions.
+
+
+#include "../include/widget.h"#include "../include/signal.h"#include "../include/fsm.h"
+ Functions
+
+ int main (int argc, char **argv)
+
+gem-graph-client main()
+
+
+
+
+Detailed Description
+
+Gem-graph client Main functions.
+
+Copyright © 2021 Libre en Communs contact@a-lec.org Copyright © 2021 Arthur Menges arthur.menges@a-lec.org Copyright © 2021-2024 Adrien Bourmault neox@a-lec.org Copyright © 2021-2024 Jean Sirmai jean@a-lec.org
+
+This file is part of Gem-graph. This program is free software: you can redistribute it and/or modify it under the terms of the GNU Affero General Public License as published by the Free Software Foundation, either version 3 of the License, or (at your option) any later version.
+
+This program is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU Affero General Public License for more details.
+
+You should have received a copy of the GNU Affero General Public License along with this program. If not, see http://www.gnu.org/licenses/.
+
+gem-graph-client main file
+
+Sur quel modèle se guider pour structurer le client gem-graph ?
+
+ https://en.wikipedia.org/wiki/Model%E2%80%93view%E2%80%93viewmodel https://en.wikipedia.org/wiki/Multitier_architecture
+
+ORGANISATION ACTUELLE (Octobre 2024)
+
+1) Les structures hierarchiques.
+
+La description du 'design' des fenêtres se trouve dans le dossier 'widget' et s'organise naturellement en arborescence, en se calquant sur l'arborescence des widgets eux-mêmes.
+
+Il sera donc facile de répartir cette description en dossiers et fichiers au fur à mesure de son développement.
+
+Actuellement, par exemple, la fenêtre principale comporte :
+une barre de titre (décrite dans 'topbar') et un widget 'child' (la partie sous la barre de titre) qui peut prendre au moins trois apparences différentes :
+
+state (montre l'état de l'espace et les commandes associées)
+
+rules (les règles et les commandes associées)
+
+stock (les données provenant des mesures, les outils d'analyse, etc.) (nom provisoire : mal défini à ce stade; fonctions à répartir...)
+
+
+ La fenêtre principale s'ouvre sur la vue de l'état ('state.c') en mode 'EXEC'. Cette vue comporte trois panneaux (widgets) principaux: sup, moyen, inf ou encore: CONTRAST, CAMERA, CONTROL ou EDIT si on veut les nommer d'après leur fonction.
+
+Lorsque la description de chaque widget s'affinera et demandera plus de place, ces trois widgets principaux deviendront des dossiers et les widgets qu'ils contiennent des fichiers (ou des dossiers si besoin) et ainsi de suite...
+
+
+2) Les structures transversales.
+
+Les fonctions 'transversales' comme celles de 'graphics', 'parse', 'fsm', 'prefer', et peut-être des structures communes à tous les arbres, listes, etc. doivent pouvoir être accédées directement sans avoir à passer par la hiérarchie des widgets et/ou callbacks. Elles restent à la racine: 'src/
+
+'finite state machine' ('fsm') va centraliser l'identification des états (apparences) de la fenêtre et des transitions entre ces apparences; Elle sera probablement décomposée en de nombreux 'sous-automates' tels que chaque état de la fenêtre soit une combinaison unique des états de ces sous-automates.
+
+Exemple, muni des deux 'sous-automates' :
+ { EXEC, EDIT }; // xor { STATE, RULES, DATA }; // xor
+ la 'finite state machine' peut se trouver dans 2 x 3 = 6 états. (voir fsm.h lignes 40-41)
+
+Les grandes fonctions du client seront lancées par cette state machine :
+
+édition automatique (optimisation) de l'arbre des conditions
+
+tests sur un mini-serveur local
+
+analyses de données...
+
+
+
+Leur recueil et la mémorisation des préférences des utilisateurs sont des fonctions centrales mais leur mise en oeuvre suivra probalement des voies hiérarchiques.
+
+On peut prévoir des préférences concernant l'apparence des widgets, les traductions, les 'disabilities'; etc. mais aussi concernant les méthodes de travail, l'usage des outils d'analyse, etc. >> des 'scripts' pour des 'méta-fonctions' (des 'macros') ?
+
+
+
+Function Documentation
+
+ main()
+main main.c
+main.c main
+int main (int argc, char ** argv)
+
+gem-graph-client main()
+
+
+Date
+
+2024-04
+
+Author
+
+Jean
+
+See also
+
+src/fsm/dispatch
+
+src/signal
+
+(none)
+
+
+
+
+Parameters
+
+
+
+
+
+
+
+argc
+
+
+
+
+**argv
+
+
+
+
+
+
+
+
+ Returns
+
+status
+
+
+
+
+
diff --git a/doc/docbook/d0/d0b/structelem.xml b/doc/docbook/d0/d0b/structelem.xml
new file mode 100644
index 0000000..3d2fb58
--- /dev/null
+++ b/doc/docbook/d0/d0b/structelem.xml
@@ -0,0 +1,37 @@
+
+
+elem Struct Reference
+elem
+
+
+phantom documentation used to test the functioning of doxygen
+
+
+
+#include <util.h>
+
+
+ Public Attributes
+
+ int value
+
+*value phantom documentation
+
+ struct elem * prev
+
+*prev phantom documentation
+
+ struct elem * next
+
+*next phantom documentation
+
+
+
+
+Detailed Description
+
+phantom documentation used to test the functioning of doxygen
+
+The documentation for this struct was generated from the following file:
+include/util.h
+
diff --git a/doc/docbook/d1/d04/structdblist.xml b/doc/docbook/d1/d04/structdblist.xml
new file mode 100644
index 0000000..dd28077
--- /dev/null
+++ b/doc/docbook/d1/d04/structdblist.xml
@@ -0,0 +1,33 @@
+
+
+dblist Struct Reference
+dblist
+
+
+phantom documentation used to test the functioning of doxygen
+
+
+
+#include <util.h>
+
+
+ Public Attributes
+
+ elem * first
+
+*first phantom documentation
+
+ elem * last
+
+*last phantom documentation
+
+
+
+
+Detailed Description
+
+phantom documentation used to test the functioning of doxygen
+
+The documentation for this struct was generated from the following file:
+include/util.h
+
diff --git a/doc/docbook/d1/d07/structfsm__struct__list__disp.xml b/doc/docbook/d1/d07/structfsm__struct__list__disp.xml
new file mode 100644
index 0000000..ebbd914
--- /dev/null
+++ b/doc/docbook/d1/d07/structfsm__struct__list__disp.xml
@@ -0,0 +1,33 @@
+
+
+fsm_struct_list_disp Struct Reference
+fsm_struct_list_disp
+
+
+phantom documentation used to test the functioning of doxygen
+
+
+
+#include <fsm.h>
+
+
+ Public Attributes
+
+ int value
+
+*value phantom documentation
+
+ struct fsm_struct_list_disp * suiv
+
+*suiv phantom documentation
+
+
+
+
+Detailed Description
+
+phantom documentation used to test the functioning of doxygen
+
+The documentation for this struct was generated from the following file:
+include/fsm.h
+
diff --git a/doc/docbook/d1/d09/structTreeNode__t.xml b/doc/docbook/d1/d09/structTreeNode__t.xml
new file mode 100644
index 0000000..ca975e2
--- /dev/null
+++ b/doc/docbook/d1/d09/structTreeNode__t.xml
@@ -0,0 +1,37 @@
+
+
+TreeNode_t Struct Reference
+TreeNode_t
+
+
+phantom documentation used to test the functioning of doxygen
+
+
+
+#include <widget.h>
+
+
+ Public Attributes
+
+ gchar * text
+
+*text phantom documentation
+
+ struct TreeNode_t * child
+
+*child phantom documentation
+
+ struct TreeNode_t * next
+
+*next phantom documentation
+
+
+
+
+Detailed Description
+
+phantom documentation used to test the functioning of doxygen
+
+The documentation for this struct was generated from the following file:
+include/widget.h
+
diff --git a/doc/docbook/d3/d03/structarrow__t.xml b/doc/docbook/d3/d03/structarrow__t.xml
new file mode 100644
index 0000000..a2c3157
--- /dev/null
+++ b/doc/docbook/d3/d03/structarrow__t.xml
@@ -0,0 +1,45 @@
+
+
+arrow_t Struct Reference
+arrow_t
+
+
+phantom documentation used to test the functioning of doxygen
+
+
+
+#include <base.h>
+
+
+ Public Attributes
+
+ uint load
+
+load phantom documentation
+
+ uint site
+
+site phantom documentation
+
+ uint x
+
+x phantom documentation
+
+ uint y
+
+y phantom documentation
+
+ uint z
+
+z phantom documentation
+
+
+
+
+Detailed Description
+
+phantom documentation used to test the functioning of doxygen
+
+The documentation for this struct was generated from the following file:
+include/base.h
+
diff --git a/doc/docbook/d3/d0f/structpreferences.xml b/doc/docbook/d3/d0f/structpreferences.xml
new file mode 100644
index 0000000..2cf9759
--- /dev/null
+++ b/doc/docbook/d3/d0f/structpreferences.xml
@@ -0,0 +1,30 @@
+
+
+preferences Struct Reference
+preferences
+
+
+use this ? static const char *icon_name [3] = { "document-revert-rtl-symbolic", "edit-undo-symbolic", "view-refresh-symbolic" };
+
+
+
+ Public Attributes
+
+ int transparency [n_objects]
+
+transparency [n_objects] phantom documentation
+
+
+
+
+Detailed Description
+
+use this ? static const char *icon_name [3] = { "document-revert-rtl-symbolic", "edit-undo-symbolic", "view-refresh-symbolic" };
+
+
+
+const char fsm_get_button_icon_name (int n) {return (const char ) icon_name [n];} phantom documentation used to test the functioning of doxygen
+
+The documentation for this struct was generated from the following file:
+src/fsm/preferences/ manager.c
+
diff --git a/doc/docbook/d4/d07/fsm_2dispatch_8c.xml b/doc/docbook/d4/d07/fsm_2dispatch_8c.xml
new file mode 100644
index 0000000..a39447d
--- /dev/null
+++ b/doc/docbook/d4/d07/fsm_2dispatch_8c.xml
@@ -0,0 +1,582 @@
+
+
+src/fsm/dispatch.c File Reference
+src/fsm/dispatch.c
+
+
+
+
+OOOOOOOOOOO OOOOO OOO OOO * OO OO OO OOOO OOOO * OO OO OO OO OO OO * OOOOOO OO OO OO OO OO * OO OO OO OOO OO * OO OO OO OO * OO OO OOO OO OO * OO OOOOOO OO OO *
+
+
+
+
+
+
+#include <stdbool.h>#include "../../include/fsm.h"#include "../../include/util.h"#include "../../include/widget.h"
+ Functions
+
+ void fsm_journal_publication_request ()
+
+The fsm_journal_publication_request() is called only once, by main(), just after closing the app and before ending the program.
+
+ void fsm_journal_event (int severity, int source, const char *file_source, const char *function_source, const char *string_value)
+
+It is mandatory for any event to call this function to be published in the journal.
+
+ void fsm_init (char *initial_message_from_main)
+
+F S M I N I T *.
+
+ void fsm_set_preferences_modified (bool value)
+
+setter for the static boolean: 'preferences_have_been_modified'
+
+ bool fsm_get_preferences_state ()
+
+getter for the static boolean: 'preferences_have_been_modified'
+
+ int fsm_get_exec_edit ()
+
+Any function that modifies the client window must obtain this boolean.
+
+ int fsm_get_state_rules_data ()
+
+Any function that modifies the client window must obtain this value.
+
+ void fsm_set_exec_edit (int choice)
+
+setter for the static value: 'choice_STATE_RULES_DATA' (in this file)
+
+ void fsm_set_state_rules_data (int choice)
+
+setter for the static value: 'choice_STATE_RULES_DATA' (in this file)
+
+
+
+
+Detailed Description
+
+
+
+OOOOOOOOOOO OOOOO OOO OOO * OO OO OO OOOO OOOO * OO OO OO OO OO OO * OOOOOO OO OO OO OO OO * OO OO OO OOO OO * OO OO OO OO * OO OO OOO OO OO * OO OOOOOO OO OO *
+
+
+
+
+
+This Finite State Machine (fsm) describes all the possible states of the Gem-graph client and all the transitions between these states.
+
+gem-graph-client fsm (Finite State Machine) manages four topics:
+
+engine (window appearance)
+
+measures (current measurements)
+
+results (current data acquisition and displays)
+
+preferences (current user preferences)
+
+
+
+Each state of the finite state machine (fsm) is a combination of their states.
+
+It must be
+
+saved at the end of a work session and
+
+reread (available) at the start of a new session.
+
+
+
+No state of the fsm should be defined in another module. No fsm transition needs to be executed in another module.
+
+The journal is created, edited and published from here.
+
+
+Function Documentation
+
+ fsm_get_exec_edit()
+fsm_get_exec_edit dispatch.c
+dispatch.c fsm_get_exec_edit
+int fsm_get_exec_edit ( )
+
+Any function that modifies the client window must obtain this boolean.
+
+
+The 'state' and 'rules' pages appearance depends heavily on this.
+
+see include/fsm enum fsm_enum_exec_edit { EXEC, EDIT } The current int may be replaced by a boolean before publication. TODO
+
+Date
+
+2024-08
+
+Author
+
+Jean
+
+See also
+
+src/widget/one_rule/dispatch
+
+src/widget/state/dispatch * 2
+
+src/signal
+
+include/fsm enum fsm_enum_exec_edit { EXEC, EDIT } << TODO check this
+
+Returns
+
+choice_EXEC_EDIT
+
+
+
+
+ fsm_get_preferences_state()
+fsm_get_preferences_state dispatch.c
+dispatch.c fsm_get_preferences_state
+bool fsm_get_preferences_state ( )
+
+getter for the static boolean: 'preferences_have_been_modified'
+
+
+Date
+
+2024-08
+
+Author
+
+Jean
+
+See also
+
+TODO A function must obtain this boolean when it stores the current state of the fsm (including preferences) before closing the current session.
+
+(none)
+
+Returns
+
+preferences_have_been_modified
+
+
+
+
+ fsm_get_state_rules_data()
+fsm_get_state_rules_data dispatch.c
+dispatch.c fsm_get_state_rules_data
+int fsm_get_state_rules_data ( )
+
+Any function that modifies the client window must obtain this value.
+
+
+The pages selection and the window appearance depends heavily on this.
+
+see include/fsm enum fsm_enum_state_rules_data { SYNTH, STATE, RULES, DATA }
+
+Date
+
+2024-08
+
+Author
+
+Jean
+
+See also
+
+src/widget/topbar/left
+
+src/signal
+
+(none)
+
+Returns
+
+choice_STATE_RULES_DATA
+
+
+
+
+ fsm_init()
+fsm_init dispatch.c
+dispatch.c fsm_init
+void fsm_init (char * initial_message_from_main)
+
+F S M I N I T *.
+
+
+This is the first function called by ' main.c' It initiates the journal and four lists which are: 'measures', 'results', 'displayables results' and 'preferences'. These lists will be used to define the current state of the fsm.
+
+Date
+
+2024-08
+
+Author
+
+Jean
+
+See also
+
+src/main/main()
+
+src/journal/fsm_journal_init()
+
+src/fsm/dispatch/fsm_journal_event()
+
+src/fsm/measures/manager/fsm_list_init_measures()
+
+src/fsm/results/manager/fsm_list_init_results()
+
+src/fsm/preferences/manager/fsm_list_init_displayables()
+
+src/fsm/preferences/manager/fsm_list_init_preferences()
+
+
+
+
+Parameters
+
+
+
+
+
+
+
+*initial_message_from_main
+
+
+
+
+
+
+
+
+
+
+
+ fsm_journal_event()
+fsm_journal_event dispatch.c
+dispatch.c fsm_journal_event
+void fsm_journal_event (int severity, int source, const char * file_source, const char * function_source, const char * string_value)
+
+It is mandatory for any event to call this function to be published in the journal.
+
+
+Before publication, a filter can be applied here (and only here) to select only some events of interest (during debugging, for example).
+
+If there are too many events, a filter can be applied here to select a few interesting events for publication in the log.
+
+This filter can operate on any the following five parameters: severity, source, *file_source, *function_source, *string_value. See also
+
+below (params)
+
+Simple filters (on a single parameter) can be combined using the logical operators 'and' and 'or' and parentheses.
+
+Use: $ grep -r "fsm_journal_event" to confirm the callergraph calls.
+
+Date
+
+2024-08
+
+Author
+
+Jean
+
+See also
+
+src/journal.c/fsm_journal_push_front()
+
+src/main/main()
+
+src/widget/topbar/modal.c
+
+src/widget/topbar/right.c
+
+src/widget/topbar/dialog.c
+
+src/widget/topbar/left.c
+
+src/widget/topbar/dispatch.c * 3
+
+src/widget/one_rule/dispatch.c
+
+src/widget/one_rule/algebra/conditions.c * 2
+
+src/widget/measure/dispatch.c
+
+src/widget/dispatch.c * 3
+
+src/widget/all_rules/dispatch.c
+
+ src/fsm/preferences/manager.c * 8
+
+src/fsm/measures/manager.c * 2
+
+src/fsm/measures/tools_list.c * 4
+
+ src/fsm/dispatch.c * 10
+
+src/fsm/results/manager.c
+
+src/util/tree.c
+
+src/signal.c * 38
+
+
+
+
+Parameters
+
+
+
+
+
+
+
+severity
+<>
+
+
+
+
+
+
+
+ See also
+
+enum fsm_enum_journal_severity in include/fsm.h 'severity' is a pre-defined value that must be associated to each event. It ranges from zero to six : CRITICAL ERROR WARNING INFO MESSAGE DEBUG SPEW 0 1 2 3 4 5 6
+
+
+
+
+Parameters
+
+
+
+
+
+
+
+source
+<>
+
+
+
+
+
+
+
+ See also
+
+enum fsm_enum_journal_source in include/fsm.h 'source' is a pre-defined value that can be associated to each event. It is not mandatory. It can be set to 'NULL'.
+
+
+
+
+Parameters
+
+
+
+
+
+
+
+*file_source
+<> the name of the file that emits the event.
+
+
+
+*function_source
+<> the function that emits the event.
+
+
+
+*string_value
+<> any value that can qualify the event and provides useful information when reading the log.
+
+
+
+
+
+
+
+
+
+
+ fsm_journal_publication_request()
+fsm_journal_publication_request dispatch.c
+dispatch.c fsm_journal_publication_request
+void fsm_journal_publication_request ( )
+
+The fsm_journal_publication_request() is called only once, by main(), just after closing the app and before ending the program.
+
+
+This is to guarantee the chronological order of the events in the journal.
+
+The log is modified for each event but events can be send asynchronously. This is why the journal is only published once, before the end of "main()", Its chronological order is therefore guaranteed.
+
+src/journal.c/fsm_journal_publish() (called here) is the last function of the program to be executed.
+
+The fsm_struct_journal (gg_logs) is a static instance in this file. Therefore, all the functions that read or write it are in this file. This is to avoid uncontrolled operations on it.
+
+Date
+
+2024-08
+
+Author
+
+Jean
+
+See also
+
+src/main/main()
+
+src/journal/fsm_journal_publish()
+
+
+
+
+ fsm_set_exec_edit()
+fsm_set_exec_edit dispatch.c
+dispatch.c fsm_set_exec_edit
+void fsm_set_exec_edit (int choice)
+
+setter for the static value: 'choice_STATE_RULES_DATA' (in this file)
+
+
+see include/fsm enum fsm_enum_exec_edit { EXEC, EDIT }
+
+Date
+
+2024-08
+
+Author
+
+Jean
+
+See also
+
+(none)
+
+src/signal * 2
+
+
+
+
+Parameters
+
+
+
+
+
+
+
+choice
+< a boolean value which can be "EXEC" or "EDIT"
+
+
+
+
+
+
+
+
+
+
+ fsm_set_preferences_modified()
+fsm_set_preferences_modified dispatch.c
+dispatch.c fsm_set_preferences_modified
+void fsm_set_preferences_modified (bool value)
+
+setter for the static boolean: 'preferences_have_been_modified'
+
+
+Date
+
+2024-08
+
+Author
+
+Jean
+
+See also
+
+TODO To be used by any function that modifies the current user preferences
+
+ fsm_journal_event()
+
+
+
+
+Parameters
+
+
+
+
+
+
+
+value
+= TRUE if preferences_have_been_modified.
+
+
+
+
+
+
+
+
+
+
+ fsm_set_state_rules_data()
+fsm_set_state_rules_data dispatch.c
+dispatch.c fsm_set_state_rules_data
+void fsm_set_state_rules_data (int choice)
+
+setter for the static value: 'choice_STATE_RULES_DATA' (in this file)
+
+
+see include/fsm enum fsm_enum_state_rules_data { SYNTH, STATE, RULES, DATA } Today (2024-10) the initial page is set to 'SYNTH'. See also
+
+line 292 choice_STATE_RULES_DATA = SYNTH; NB This choice can be temporarily modified for debugging purpose:
+
+end of the function: fsm/dispatch.c window_design_topbar_left()
+
+Date
+
+2024-08
+
+Author
+
+Jean
+
+See also
+
+src/signal * 4
+
+(none)
+
+
+
+
+Parameters
+
+
+
+
+
+
+
+choice
+
+
+
+
+
+
+
+
+
+
+
+
diff --git a/doc/docbook/d5/d00/structfsm__struct__list__tool.xml b/doc/docbook/d5/d00/structfsm__struct__list__tool.xml
new file mode 100644
index 0000000..6449a0a
--- /dev/null
+++ b/doc/docbook/d5/d00/structfsm__struct__list__tool.xml
@@ -0,0 +1,33 @@
+
+
+fsm_struct_list_tool Struct Reference
+fsm_struct_list_tool
+
+
+phantom documentation used to test the functioning of doxygen
+
+
+
+#include <fsm.h>
+
+
+ Public Attributes
+
+ int value
+
+*value phantom documentation
+
+ struct fsm_struct_list_tool * suiv
+
+*suiv phantom documentation
+
+
+
+
+Detailed Description
+
+phantom documentation used to test the functioning of doxygen
+
+The documentation for this struct was generated from the following file:
+include/fsm.h
+
diff --git a/doc/docbook/d7/d02/structstack__index__t.xml b/doc/docbook/d7/d02/structstack__index__t.xml
new file mode 100644
index 0000000..9879c91
--- /dev/null
+++ b/doc/docbook/d7/d02/structstack__index__t.xml
@@ -0,0 +1,34 @@
+
+
+stack_index_t Struct Reference
+stack_index_t
+
+
+phantom documentation used to test the functioning of doxygen
+
+
+
+ Public Attributes
+
+ long stack_id
+
+stack_id phantom documentation
+
+ void * container_widget
+
+container_widget phantom documentation
+
+ void * gl_area
+
+gl_area phantom documentation
+
+
+
+
+Detailed Description
+
+phantom documentation used to test the functioning of doxygen
+
+The documentation for this struct was generated from the following file:
+src/util/draw/ gl.c
+
diff --git a/doc/docbook/d7/d07/structStack.xml b/doc/docbook/d7/d07/structStack.xml
new file mode 100644
index 0000000..8966a4b
--- /dev/null
+++ b/doc/docbook/d7/d07/structStack.xml
@@ -0,0 +1,34 @@
+
+
+Stack Struct Reference
+Stack
+
+
+struct images_bff {GtkWidget *arr[MAX_SIZE]; int top;}; static struct images_bff *my_list = NULL;//, *babar = NULL; static struct images_bff *alloc_images_bff () { struct images_bff *p; p = malloc (sizeof (struct images_bff)); if (p == NULL) printf ("fatal: ran out of storage"); p->arr[MAX_SIZE] = NULL; p->top = 0; return p; } static void add_to_mylist (int my_int) { struct images_bff *p = alloc_images_bff (); p->arr[MAX_SIZE] = NULL; // TODO p->top = my_int; my_list = p; } static void free_intlist (struct images_bff *p) { TODO } TODO free_intlist (mylist); TODO mylist = NULL; TODO offsetof (type, field)
+
+
+
+ Public Attributes
+
+ GtkWidget * arr [MAX_SIZE]
+
+*arr[MAX_SIZE] phantom documentation
+
+ int top
+
+top phantom documentation
+
+
+
+
+Detailed Description
+
+struct images_bff {GtkWidget *arr[MAX_SIZE]; int top;}; static struct images_bff *my_list = NULL;//, *babar = NULL; static struct images_bff *alloc_images_bff () { struct images_bff *p; p = malloc (sizeof (struct images_bff)); if (p == NULL) printf ("fatal: ran out of storage"); p->arr[MAX_SIZE] = NULL; p->top = 0; return p; } static void add_to_mylist (int my_int) { struct images_bff *p = alloc_images_bff (); p->arr[MAX_SIZE] = NULL; // TODO p->top = my_int; my_list = p; } static void free_intlist (struct images_bff *p) { TODO } TODO free_intlist (mylist); TODO mylist = NULL; TODO offsetof (type, field)
+
+
+
+phantom documentation used to test the functioning of doxygen
+
+The documentation for this struct was generated from the following file:
+src/widget/all_rules/compare/interest.c
+
diff --git a/doc/docbook/d7/d08/structfsm__struct__journal__unit.xml b/doc/docbook/d7/d08/structfsm__struct__journal__unit.xml
new file mode 100644
index 0000000..e25e3b7
--- /dev/null
+++ b/doc/docbook/d7/d08/structfsm__struct__journal__unit.xml
@@ -0,0 +1,119 @@
+
+
+fsm_struct_journal_unit Struct Reference
+fsm_struct_journal_unit
+
+
+phantom documentation used to test the functioning of doxygen
+
+
+
+#include <fsm.h>
+
+
+ Public Attributes
+
+ long yy_dd_mm
+
+ long usec
+
+ const char * file_source
+
+ const char * function_source
+
+ const char * string_value
+
+ struct fsm_struct_journal_unit * prev
+
+ struct fsm_struct_journal_unit * next
+
+
+
+
+Detailed Description
+
+phantom documentation used to test the functioning of doxygen
+
+
+Member Data Documentation
+
+ file_source
+file_source fsm_struct_journal_unit
+fsm_struct_journal_unit file_source
+const char* fsm_struct_journal_unit::file_source
+
+
+phantom documentation
+
+
+
+
+ function_source
+function_source fsm_struct_journal_unit
+fsm_struct_journal_unit function_source
+const char* fsm_struct_journal_unit::function_source
+
+
+phantom documentation
+
+
+
+
+ next
+next fsm_struct_journal_unit
+fsm_struct_journal_unit next
+struct fsm_struct_journal_unit* fsm_struct_journal_unit::next
+
+
+phantom documentation
+
+
+
+
+ prev
+prev fsm_struct_journal_unit
+fsm_struct_journal_unit prev
+struct fsm_struct_journal_unit* fsm_struct_journal_unit::prev
+
+
+phantom documentation
+
+
+
+
+ string_value
+string_value fsm_struct_journal_unit
+fsm_struct_journal_unit string_value
+const char* fsm_struct_journal_unit::string_value
+
+
+phantom documentation
+
+
+
+
+ usec
+usec fsm_struct_journal_unit
+fsm_struct_journal_unit usec
+long fsm_struct_journal_unit::usec
+
+
+phantom documentation
+
+
+
+
+ yy_dd_mm
+yy_dd_mm fsm_struct_journal_unit
+fsm_struct_journal_unit yy_dd_mm
+long fsm_struct_journal_unit::yy_dd_mm
+
+
+phantom documentation
+
+
+
+
+The documentation for this struct was generated from the following file:
+include/fsm.h
+
diff --git a/doc/docbook/d9/d03/structfsm__struct__journal.xml b/doc/docbook/d9/d03/structfsm__struct__journal.xml
new file mode 100644
index 0000000..2dceb7c
--- /dev/null
+++ b/doc/docbook/d9/d03/structfsm__struct__journal.xml
@@ -0,0 +1,54 @@
+
+
+fsm_struct_journal Struct Reference
+fsm_struct_journal
+
+
+phantom documentation used to test the functioning of doxygen
+
+
+
+#include <fsm.h>
+
+
+ Public Attributes
+
+ fsm_struct_journal_unit * first
+
+ fsm_struct_journal_unit * last
+
+
+
+
+Detailed Description
+
+phantom documentation used to test the functioning of doxygen
+
+
+Member Data Documentation
+
+ first
+first fsm_struct_journal
+fsm_struct_journal first
+ fsm_struct_journal_unit* fsm_struct_journal::first
+
+
+phantom documentation
+
+
+
+
+ last
+last fsm_struct_journal
+fsm_struct_journal last
+ fsm_struct_journal_unit* fsm_struct_journal::last
+
+
+phantom documentation
+
+
+
+
+The documentation for this struct was generated from the following file:
+include/fsm.h
+
diff --git a/doc/docbook/d9/d04/structfsm__struct__list__data.xml b/doc/docbook/d9/d04/structfsm__struct__list__data.xml
new file mode 100644
index 0000000..062b6a4
--- /dev/null
+++ b/doc/docbook/d9/d04/structfsm__struct__list__data.xml
@@ -0,0 +1,33 @@
+
+
+fsm_struct_list_data Struct Reference
+fsm_struct_list_data
+
+
+phantom documentation used to test the functioning of doxygen
+
+
+
+#include <fsm.h>
+
+
+ Public Attributes
+
+ int value
+
+*value phantom documentation
+
+ struct fsm_struct_list_data * suiv
+
+*suiv phantom documentation
+
+
+
+
+Detailed Description
+
+phantom documentation used to test the functioning of doxygen
+
+The documentation for this struct was generated from the following file:
+include/fsm.h
+
diff --git a/doc/docbook/d9/d06/preferences_2manager_8c.xml b/doc/docbook/d9/d06/preferences_2manager_8c.xml
new file mode 100644
index 0000000..93e761c
--- /dev/null
+++ b/doc/docbook/d9/d06/preferences_2manager_8c.xml
@@ -0,0 +1,48 @@
+
+
+src/fsm/preferences/manager.c File Reference
+src/fsm/preferences/manager.c
+#include "../../../include/fsm.h"#include "../../../include/signal.h"#include "../../../include/widget.h"
+ Classes
+
+ struct preferences
+
+use this ? static const char *icon_name [3] = { "document-revert-rtl-symbolic", "edit-undo-symbolic", "view-refresh-symbolic" };
+
+
+
+
+ Functions
+
+ void fsm_set_store_restore_reset (int choice, int value)
+
+phantom documentation used to test the functioning of doxygen
+
+ void fsm_reset_all_situations_values (int value)
+
+phantom documentation used to test the functioning of doxygen
+
+ void fsm_add_displayable (char *displayable_name)
+
+phantom documentation used to test the functioning of doxygen
+
+ void fsm_list_init_preferences ()
+
+phantom documentation used to test the functioning of doxygen
+
+ void fsm_list_init_displayables ()
+
+phantom documentation used to test the functioning of doxygen
+
+
+
+
+ Variables
+
+ struct preferences * pref_jean = NULL
+
+phantom documentation used to test the functioning of doxygen
+
+
+
+
diff --git a/doc/docbook/da/d03/structpile.xml b/doc/docbook/da/d03/structpile.xml
new file mode 100644
index 0000000..03d1f92
--- /dev/null
+++ b/doc/docbook/da/d03/structpile.xml
@@ -0,0 +1,33 @@
+
+
+pile Struct Reference
+pile
+
+
+phantom documentation used to test the functioning of doxygen
+
+
+
+#include <util.h>
+
+
+ Public Attributes
+
+ int value
+
+value phantom documentation
+
+ struct pile * prev
+
+*prev phantom documentation
+
+
+
+
+Detailed Description
+
+phantom documentation used to test the functioning of doxygen
+
+The documentation for this struct was generated from the following file:
+include/util.h
+
diff --git a/doc/docbook/da/d0c/gl_8c.xml b/doc/docbook/da/d0c/gl_8c.xml
new file mode 100644
index 0000000..ecfab77
--- /dev/null
+++ b/doc/docbook/da/d0c/gl_8c.xml
@@ -0,0 +1,360 @@
+
+
+src/util/draw/gl.c File Reference
+src/util/draw/gl.c
+#include "../../../include/graphics.h"#include "../../../include/signal.h"
+ Classes
+
+ struct stack_index_t
+
+phantom documentation used to test the functioning of doxygen
+
+
+
+
+ Macros
+
+ #define GL_AREA_SIZE 400
+
+phantom documentation used to test the functioning of doxygen
+
+
+
+
+ Functions
+
+ int util_gl_set_arrow (int stack_id, int arrows_nb, int space_X, int space_Y, int space_Z, int requested_weight, int site, int arrow_x, int arrow_y, int arrow_z)
+
+phantom documentation used to test the functioning of doxygen
+
+ long util_gl_get_stack (void *container_widget)
+
+Look for stack entry and returns stack_id.
+
+ long util_gl_is_ready (void *container_widget)
+
+Look for stack entry and returns stack_id.
+
+ bool util_gl_init_stack (void *container_widget, GError *error_buffer)
+
+Look for stack entry and initializes OpenGL for it.
+
+ bool util_gl_shutdown_stack (void *container_widget, GError *error_buffer)
+
+Look for stack entry and shutdowns OpenGL for it.
+
+ void util_gl_clean_stack_index (void)
+
+phantom documentation used to test the functioning of doxygen
+
+ bool util_gl_render_stack (GtkWidget *container_widget)
+
+Look for stack entry and triggers OpenGL for drawing.
+
+ bool util_gl_update_axis (GtkWidget *container_widget, int axis, int value)
+
+Look for stack entry and triggers OpenGL for drawing.
+
+ void util_gl_shutdown_all_stacks (void)
+
+Look for every stack entry and shutdowns OpenGL for it.
+
+ GtkWidget * create_axis_slider (int axis)
+
+Creates a slider widget.
+
+ bool util_gl_setup_glarea (int target_mode, GtkWidget *target_widget)
+
+phantom documentation used to test the functioning of doxygen
+
+
+
+
+ Variables
+
+ size_t stack_index_size = 0
+
+phantom documentation used to test the functioning of doxygen
+
+
+
+
+Function Documentation
+
+ create_axis_slider()
+create_axis_slider gl.c
+gl.c create_axis_slider
+GtkWidget * create_axis_slider (int axis)
+
+Creates a slider widget.
+
+
+
+
+
+Parameters
+
+
+
+
+
+
+
+axis
+the axis we're building a label for
+
+
+
+
+
+
+
+ Returns
+
+GtkWidget*: pointer to the new widget
+
+
+
+
+ util_gl_get_stack()
+util_gl_get_stack gl.c
+gl.c util_gl_get_stack
+long util_gl_get_stack (void * container_widget)
+
+Look for stack entry and returns stack_id.
+
+
+
+
+
+Parameters
+
+
+
+
+
+
+
+container_widget
+generally the GtkBox that contains the GLArea
+
+
+
+
+
+
+
+ Returns
+
+stack_id
+
+
+
+
+ util_gl_init_stack()
+util_gl_init_stack gl.c
+gl.c util_gl_init_stack
+bool util_gl_init_stack (void * container_widget, GError * error_buffer)
+
+Look for stack entry and initializes OpenGL for it.
+
+
+
+
+
+Parameters
+
+
+
+
+
+
+
+container_widget
+generally the GtkBox that contains the GLArea
+
+
+
+error_buffer
+phantom documentation used to test the functioning of doxygen
+
+
+
+
+
+
+
+ Returns
+
+bool: true if success
+
+
+
+
+ util_gl_is_ready()
+util_gl_is_ready gl.c
+gl.c util_gl_is_ready
+long util_gl_is_ready (void * container_widget)
+
+Look for stack entry and returns stack_id.
+
+
+
+
+
+Parameters
+
+
+
+
+
+
+
+container_widget
+generally the GtkBox that contains the GLArea
+
+
+
+
+
+
+
+ Returns
+
+stack_id
+
+
+
+
+ util_gl_render_stack()
+util_gl_render_stack gl.c
+gl.c util_gl_render_stack
+bool util_gl_render_stack (GtkWidget * container_widget)
+
+Look for stack entry and triggers OpenGL for drawing.
+
+
+
+
+
+Parameters
+
+
+
+
+
+
+
+container_widget
+generally the GtkBox that contains the GLArea
+
+
+
+
+
+
+
+ Returns
+
+bool: true if success
+
+
+
+
+ util_gl_shutdown_all_stacks()
+util_gl_shutdown_all_stacks gl.c
+gl.c util_gl_shutdown_all_stacks
+void util_gl_shutdown_all_stacks (void )
+
+Look for every stack entry and shutdowns OpenGL for it.
+
+
+returns true if success ? TODO why not bool ?
+
+
+ util_gl_shutdown_stack()
+util_gl_shutdown_stack gl.c
+gl.c util_gl_shutdown_stack
+bool util_gl_shutdown_stack (void * container_widget, GError * error_buffer)
+
+Look for stack entry and shutdowns OpenGL for it.
+
+
+
+
+
+Parameters
+
+
+
+
+
+
+
+container_widget
+generally the GtkBox that contains the GLArea
+
+
+
+error_buffer
+phantom documentation used to test the functioning of doxygen
+
+
+
+
+
+
+
+ Returns
+
+bool: true if success
+
+
+
+
+ util_gl_update_axis()
+util_gl_update_axis gl.c
+gl.c util_gl_update_axis
+bool util_gl_update_axis (GtkWidget * container_widget, int axis, int value)
+
+Look for stack entry and triggers OpenGL for drawing.
+
+
+
+
+
+Parameters
+
+
+
+
+
+
+
+container_widget
+generally the GtkBox that contains the GLArea
+
+
+
+axis
+phantom documentation used to test the functioning of doxygen
+
+
+
+value
+phantom documentation used to test the functioning of doxygen
+
+
+
+
+
+
+
+ Returns
+
+bool: true if success
+
+
+
+
+
diff --git a/doc/docbook/dd/d0e/structgraphics__stack__t.xml b/doc/docbook/dd/d0e/structgraphics__stack__t.xml
new file mode 100644
index 0000000..4485a4c
--- /dev/null
+++ b/doc/docbook/dd/d0e/structgraphics__stack__t.xml
@@ -0,0 +1,121 @@
+
+
+graphics_stack_t Struct Reference
+graphics_stack_t
+
+
+Structure describing a gl_area and its parameters, used to create a table of Gem-graph client current gl_areas.
+
+
+
+#include <graphics.h>
+
+
+ Public Attributes
+
+ int id
+
+phantom documentation
+
+ int mode
+
+phantom documentation
+
+ float rotation_angles [N_AXIS]
+
+Rotation angles on each axis.
+
+ GLuint vao
+
+init_buffers
+
+ GLuint position_buffer
+
+shutdown, draw
+
+ GLuint color_buffer
+
+shutdown, draw
+
+ GLuint program
+
+shutdown, init_shaders, draw
+
+ GLuint m
+
+init_shaders, draw
+
+ GLuint v
+
+init_shaders, draw
+
+ GLuint p
+
+init_shaders, draw
+
+ struct arrow_t * arrows_ptr
+
+phantom documentation
+
+ long arrows_nb
+
+phantom documentation
+
+ GLfloat * buffer_vertex_origin
+
+phantom documentation
+
+ GLfloat * buffer_colors_origin
+
+phantom documentation
+
+ GLuint * buffer_lines_origin
+
+phantom documentation
+
+ GLuint * buffer_plans_origin
+
+phantom documentation
+
+ long buffer_vertex_size
+
+phantom documentation
+
+ long buffer_colors_size
+
+phantom documentation
+
+ long buffer_lines_size
+
+phantom documentation
+
+ long buffer_plans_size
+
+phantom documentation
+
+ long buffer_vertex_0_arrow
+
+phantom documentation
+
+ long buffer_colors_0_arrow
+
+phantom documentation
+
+ long buffer_lines_0_arrow
+
+phantom documentation
+
+ long buffer_plans_0_arrow
+
+phantom documentation
+
+
+
+
+Detailed Description
+
+Structure describing a gl_area and its parameters, used to create a table of Gem-graph client current gl_areas.
+
+The documentation for this struct was generated from the following file:
+include/graphics.h
+
diff --git a/doc/docbook/df/d05/structslist.xml b/doc/docbook/df/d05/structslist.xml
new file mode 100644
index 0000000..a445930
--- /dev/null
+++ b/doc/docbook/df/d05/structslist.xml
@@ -0,0 +1,33 @@
+
+
+slist Struct Reference
+slist
+
+
+phantom documentation used to test the functioning of doxygen
+
+
+
+#include <util.h>
+
+
+ Public Attributes
+
+ int value
+
+value phantom documentation
+
+ struct slist * suiv
+
+*suiv phantom documentation
+
+
+
+
+Detailed Description
+
+phantom documentation used to test the functioning of doxygen
+
+The documentation for this struct was generated from the following file:
+include/util.h
+
diff --git a/doc/docbook/gg_calligraphie.png b/doc/docbook/gg_calligraphie.png
new file mode 100644
index 0000000..f707101
Binary files /dev/null and b/doc/docbook/gg_calligraphie.png differ
diff --git a/doc/docbook/index.xml b/doc/docbook/index.xml
new file mode 100644
index 0000000..568b4bc
--- /dev/null
+++ b/doc/docbook/index.xml
@@ -0,0 +1,32 @@
+
+
+
+ Gem-graph
+
+
+ Class Documentation
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+ File Documentation
+
+
+
+
+
+
+
diff --git a/doc/latex/Makefile b/doc/latex/Makefile
new file mode 100644
index 0000000..7f82972
--- /dev/null
+++ b/doc/latex/Makefile
@@ -0,0 +1,27 @@
+LATEX_CMD?=pdflatex
+MKIDX_CMD?=makeindex
+BIBTEX_CMD?=bibtex
+LATEX_COUNT?=8
+MANUAL_FILE?=refman
+
+all: $(MANUAL_FILE).pdf
+
+pdf: $(MANUAL_FILE).pdf
+
+$(MANUAL_FILE).pdf: clean $(MANUAL_FILE).tex
+ $(LATEX_CMD) $(MANUAL_FILE)
+ $(MKIDX_CMD) $(MANUAL_FILE).idx
+ $(LATEX_CMD) $(MANUAL_FILE)
+ latex_count=$(LATEX_COUNT) ; \
+ while grep -E -s 'Rerun (LaTeX|to get cross-references right|to get bibliographical references right)' $(MANUAL_FILE).log && [ $$latex_count -gt 0 ] ;\
+ do \
+ echo "Rerunning latex...." ;\
+ $(LATEX_CMD) $(MANUAL_FILE) ;\
+ latex_count=`expr $$latex_count - 1` ;\
+ done
+ $(MKIDX_CMD) $(MANUAL_FILE).idx
+ $(LATEX_CMD) $(MANUAL_FILE)
+
+
+clean:
+ rm -f *.ps *.dvi *.aux *.toc *.idx *.ind *.ilg *.log *.out *.brf *.blg *.bbl $(MANUAL_FILE).pdf
diff --git a/doc/latex/annotated.tex b/doc/latex/annotated.tex
new file mode 100644
index 0000000..509aa9c
--- /dev/null
+++ b/doc/latex/annotated.tex
@@ -0,0 +1,18 @@
+\doxysection{Class List}
+Here are the classes, structs, unions and interfaces with brief descriptions\+:\begin{DoxyCompactList}
+\item\contentsline{section}{\mbox{\hyperlink{structarrow__t}{arrow\+\_\+t}} \\*Phantom documentation used to test the functioning of doxygen }{\pageref{structarrow__t}}{}
+\item\contentsline{section}{\mbox{\hyperlink{structdblist}{dblist}} \\*Phantom documentation used to test the functioning of doxygen }{\pageref{structdblist}}{}
+\item\contentsline{section}{\mbox{\hyperlink{structelem}{elem}} \\*Phantom documentation used to test the functioning of doxygen }{\pageref{structelem}}{}
+\item\contentsline{section}{\mbox{\hyperlink{structfsm__struct__journal}{fsm\+\_\+struct\+\_\+journal}} \\*Phantom documentation used to test the functioning of doxygen }{\pageref{structfsm__struct__journal}}{}
+\item\contentsline{section}{\mbox{\hyperlink{structfsm__struct__journal__unit}{fsm\+\_\+struct\+\_\+journal\+\_\+unit}} \\*Phantom documentation used to test the functioning of doxygen }{\pageref{structfsm__struct__journal__unit}}{}
+\item\contentsline{section}{\mbox{\hyperlink{structfsm__struct__list__data}{fsm\+\_\+struct\+\_\+list\+\_\+data}} \\*Phantom documentation used to test the functioning of doxygen }{\pageref{structfsm__struct__list__data}}{}
+\item\contentsline{section}{\mbox{\hyperlink{structfsm__struct__list__disp}{fsm\+\_\+struct\+\_\+list\+\_\+disp}} \\*Phantom documentation used to test the functioning of doxygen }{\pageref{structfsm__struct__list__disp}}{}
+\item\contentsline{section}{\mbox{\hyperlink{structfsm__struct__list__tool}{fsm\+\_\+struct\+\_\+list\+\_\+tool}} \\*Phantom documentation used to test the functioning of doxygen }{\pageref{structfsm__struct__list__tool}}{}
+\item\contentsline{section}{\mbox{\hyperlink{structgraphics__stack__t}{graphics\+\_\+stack\+\_\+t}} \\*Structure describing a gl\+\_\+area and its parameters, used to create a table of Gem-\/graph client current gl\+\_\+areas }{\pageref{structgraphics__stack__t}}{}
+\item\contentsline{section}{\mbox{\hyperlink{structpile}{pile}} \\*Phantom documentation used to test the functioning of doxygen }{\pageref{structpile}}{}
+\item\contentsline{section}{\mbox{\hyperlink{structpreferences}{preferences}} \\*Use this ? static const char \texorpdfstring{$\ast$}{*}icon\+\_\+name \mbox{[}3\mbox{]} = \{ "{}document-\/revert-\/rtl-\/symbolic"{}, "{}edit-\/undo-\/symbolic"{}, "{}view-\/refresh-\/symbolic"{} \}; }{\pageref{structpreferences}}{}
+\item\contentsline{section}{\mbox{\hyperlink{structslist}{slist}} \\*Phantom documentation used to test the functioning of doxygen }{\pageref{structslist}}{}
+\item\contentsline{section}{\mbox{\hyperlink{structStack}{Stack}} \\*Struct images\+\_\+bff \{Gtk\+Widget \texorpdfstring{$\ast$}{*}arr\mbox{[}MAX\+\_\+\+SIZE\mbox{]}; int top;\}; static struct images\+\_\+bff \texorpdfstring{$\ast$}{*}my\+\_\+list = NULL;//, \texorpdfstring{$\ast$}{*}babar = NULL; static struct images\+\_\+bff \texorpdfstring{$\ast$}{*}alloc\+\_\+images\+\_\+bff () \{ struct images\+\_\+bff \texorpdfstring{$\ast$}{*}p; p = malloc (sizeof (struct images\+\_\+bff)); if (p == NULL) printf ("{}fatal\+: ran out of storage"{}); p-\/\texorpdfstring{$>$}{>}arr\mbox{[}MAX\+\_\+\+SIZE\mbox{]} = NULL; p-\/\texorpdfstring{$>$}{>}top = 0; return p; \} static void add\+\_\+to\+\_\+mylist (int my\+\_\+int) \{ struct images\+\_\+bff \texorpdfstring{$\ast$}{*}p = alloc\+\_\+images\+\_\+bff (); p-\/\texorpdfstring{$>$}{>}arr\mbox{[}MAX\+\_\+\+SIZE\mbox{]} = NULL; // TODO p-\/\texorpdfstring{$>$}{>}top = my\+\_\+int; my\+\_\+list = p; \} static void free\+\_\+intlist (struct images\+\_\+bff \texorpdfstring{$\ast$}{*}p) \{ TODO \} TODO free\+\_\+intlist (mylist); TODO mylist = NULL; TODO offsetof (type, field) }{\pageref{structStack}}{}
+\item\contentsline{section}{\mbox{\hyperlink{structstack__index__t}{stack\+\_\+index\+\_\+t}} \\*Phantom documentation used to test the functioning of doxygen }{\pageref{structstack__index__t}}{}
+\item\contentsline{section}{\mbox{\hyperlink{structTreeNode__t}{Tree\+Node\+\_\+t}} \\*Phantom documentation used to test the functioning of doxygen }{\pageref{structTreeNode__t}}{}
+\end{DoxyCompactList}
diff --git a/doc/latex/d0/d09/main_8c.tex b/doc/latex/d0/d09/main_8c.tex
new file mode 100644
index 0000000..d5875dd
--- /dev/null
+++ b/doc/latex/d0/d09/main_8c.tex
@@ -0,0 +1,102 @@
+\doxysection{src/main.c File Reference}
+\hypertarget{main_8c}{}\label{main_8c}\index{src/main.c@{src/main.c}}
+
+
+Gem-\/graph client Main functions.
+
+
+{\ttfamily \#include "{}../include/widget.\+h"{}}\newline
+{\ttfamily \#include "{}../include/signal.\+h"{}}\newline
+{\ttfamily \#include "{}../include/fsm.\+h"{}}\newline
+\doxysubsubsection*{Functions}
+\begin{DoxyCompactItemize}
+\item
+int \mbox{\hyperlink{main_8c_a3c04138a5bfe5d72780bb7e82a18e627}{main}} (int argc, char \texorpdfstring{$\ast$}{*}\texorpdfstring{$\ast$}{*}argv)
+\begin{DoxyCompactList}\small\item\em gem-\/graph-\/client \doxylink{main_8c_a3c04138a5bfe5d72780bb7e82a18e627}{main()} \end{DoxyCompactList}\end{DoxyCompactItemize}
+
+
+\doxysubsection{Detailed Description}
+Gem-\/graph client Main functions.
+
+Copyright © 2021 Libre en Communs \href{mailto:contact@a-lec.org}{\texttt{ contact@a-\/lec.\+org}} Copyright © 2021 Arthur Menges \href{mailto:arthur.menges@a-lec.org}{\texttt{ arthur.\+menges@a-\/lec.\+org}} Copyright © 2021-\/2024 Adrien Bourmault \href{mailto:neox@a-lec.org}{\texttt{ neox@a-\/lec.\+org}} Copyright © 2021-\/2024 Jean Sirmai \href{mailto:jean@a-lec.org}{\texttt{ jean@a-\/lec.\+org}}
+
+This file is part of Gem-\/graph. This program is free software\+: you can redistribute it and/or modify it under the terms of the GNU Affero General Public License as published by the Free Software Foundation, either version 3 of the License, or (at your option) any later version.
+
+This program is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU Affero General Public License for more details.
+
+You should have received a copy of the GNU Affero General Public License along with this program. If not, see \href{http://www.gnu.org/licenses/}{\texttt{ http\+://www.\+gnu.\+org/licenses/}}.
+
+gem-\/graph-\/client main file
+
+Sur quel modèle se guider pour structurer le client gem-\/graph ?
+
+\href{https://en.wikipedia.org/wiki/Model\%E2\%80\%93view\%E2\%80\%93viewmodel}{\texttt{ https\+://en.\+wikipedia.\+org/wiki/\+Model\%\+E2\%80\%93view\%\+E2\%80\%93viewmodel}} \href{https://en.wikipedia.org/wiki/Multitier_architecture}{\texttt{ https\+://en.\+wikipedia.\+org/wiki/\+Multitier\+\_\+architecture}}
+
+ORGANISATION ACTUELLE (Octobre 2024)\hypertarget{main_8c_autotoc_md0}{}\doxysubsubsection{\texorpdfstring{1) Les structures hierarchiques.}{1) Les structures hierarchiques.}}\label{main_8c_autotoc_md0}
+La description du \textquotesingle{}design\textquotesingle{} des fenêtres se trouve dans le dossier \textquotesingle{}widget\textquotesingle{} et s\textquotesingle{}organise naturellement en arborescence, en se calquant sur l\textquotesingle{}arborescence des widgets eux-\/mêmes.
+
+Il sera donc facile de répartir cette description en dossiers et fichiers au fur à mesure de son développement.
+
+Actuellement, par exemple, la fenêtre principale comporte \+: \begin{quote}
+une barre de titre (décrite dans \textquotesingle{}topbar\textquotesingle{}) et un widget \textquotesingle{}child\textquotesingle{} (la partie sous la barre de titre) qui peut prendre au moins trois apparences différentes \+:
+\begin{DoxyItemize}
+\item state (montre l\textquotesingle{}état de l\textquotesingle{}espace et les commandes associées)
+\item rules (les règles et les commandes associées)
+\item stock (les données provenant des mesures, les outils d\textquotesingle{}analyse, etc.) (nom provisoire \+: mal défini à ce stade; fonctions à répartir...)
+\end{DoxyItemize}\end{quote}
+La fenêtre principale s\textquotesingle{}ouvre sur la vue de l\textquotesingle{}état (\textquotesingle{}state.\+c\textquotesingle{}) en mode \textquotesingle{}EXEC\textquotesingle{}. Cette vue comporte trois panneaux (widgets) principaux\+: sup, moyen, inf ou encore\+: CONTRAST, CAMERA, CONTROL ou EDIT si on veut les nommer d\textquotesingle{}après leur fonction.
+
+Lorsque la description de chaque widget s\textquotesingle{}affinera et demandera plus de place, ces trois widgets principaux deviendront des dossiers et les widgets qu\textquotesingle{}ils contiennent des fichiers (ou des dossiers si besoin) et ainsi de suite...\hypertarget{main_8c_autotoc_md1}{}\doxysubsubsection{\texorpdfstring{2) Les structures transversales.}{2) Les structures transversales.}}\label{main_8c_autotoc_md1}
+Les fonctions \textquotesingle{}transversales\textquotesingle{} comme celles de \textquotesingle{}graphics\textquotesingle{}, \textquotesingle{}parse\textquotesingle{}, \textquotesingle{}fsm\textquotesingle{}, \textquotesingle{}prefer\textquotesingle{}, et peut-\/être des structures communes à tous les arbres, listes, etc. doivent pouvoir être accédées directement sans avoir à passer par la hiérarchie des widgets et/ou callbacks. Elles restent à la racine\+: \textquotesingle{}src/
+
+\textquotesingle{}finite state machine\textquotesingle{} (\textquotesingle{}fsm\textquotesingle{}) va centraliser l\textquotesingle{}identification des états (apparences) de la fenêtre et des transitions entre ces apparences; Elle sera probablement décomposée en de nombreux \textquotesingle{}sous-\/automates\textquotesingle{} tels que chaque état de la fenêtre soit une combinaison unique des états de ces sous-\/automates.
+
+Exemple, muni des deux \textquotesingle{}sous-\/automates\textquotesingle{} \+: \begin{quote}
+ \{ EXEC, EDIT \}; // xor \{ STATE, RULES, DATA \}; // xor \end{quote}
+la \textquotesingle{}finite state machine\textquotesingle{} peut se trouver dans 2 x 3 = 6 états. (voir fsm.\+h lignes 40-\/41)
+
+Les grandes fonctions du client seront lancées par cette state machine \+:
+\begin{DoxyItemize}
+\item édition automatique (optimisation) de l\textquotesingle{}arbre des conditions
+\item tests sur un mini-\/serveur local
+\item analyses de données...
+\end{DoxyItemize}
+
+Leur recueil et la mémorisation des préférences des utilisateurs sont des fonctions centrales mais leur mise en oeuvre suivra probalement des voies hiérarchiques.
+
+On peut prévoir des préférences concernant l\textquotesingle{}apparence des widgets, les traductions, les \textquotesingle{}disabilities\textquotesingle{}; etc. mais aussi concernant les méthodes de travail, l\textquotesingle{}usage des outils d\textquotesingle{}analyse, etc. \texorpdfstring{$>$}{>}\texorpdfstring{$>$}{>} des \textquotesingle{}scripts\textquotesingle{} pour des \textquotesingle{}méta-\/fonctions\textquotesingle{} (des \textquotesingle{}macros\textquotesingle{}) ?
+
+\doxysubsection{Function Documentation}
+\Hypertarget{main_8c_a3c04138a5bfe5d72780bb7e82a18e627}\label{main_8c_a3c04138a5bfe5d72780bb7e82a18e627}
+\index{main.c@{main.c}!main@{main}}
+\index{main@{main}!main.c@{main.c}}
+\doxysubsubsection{\texorpdfstring{main()}{main()}}
+{\footnotesize\ttfamily int main (\begin{DoxyParamCaption}\item[{int}]{argc, }\item[{char \texorpdfstring{$\ast$}{*}\texorpdfstring{$\ast$}{*}}]{argv }\end{DoxyParamCaption})}
+
+
+
+gem-\/graph-\/client \doxylink{main_8c_a3c04138a5bfe5d72780bb7e82a18e627}{main()}
+
+\begin{DoxyDate}{Date}
+2024-\/04
+\end{DoxyDate}
+\begin{DoxyAuthor}{Author}
+Jean
+\end{DoxyAuthor}
+\begin{DoxySeeAlso}{See also}
+src/fsm/dispatch
+
+src/signal
+
+(none)
+\end{DoxySeeAlso}
+
+\begin{DoxyParams}{Parameters}
+{\em argc} & \\
+\hline
+{\em \texorpdfstring{$\ast$}{*}\texorpdfstring{$\ast$}{*}argv} & \\
+\hline
+\end{DoxyParams}
+\begin{DoxyReturn}{Returns}
+status
+\end{DoxyReturn}
diff --git a/doc/latex/d0/d0b/structelem.tex b/doc/latex/d0/d0b/structelem.tex
new file mode 100644
index 0000000..0bcfae6
--- /dev/null
+++ b/doc/latex/d0/d0b/structelem.tex
@@ -0,0 +1,31 @@
+\doxysection{elem Struct Reference}
+\hypertarget{structelem}{}\label{structelem}\index{elem@{elem}}
+
+
+phantom documentation used to test the functioning of doxygen
+
+
+
+
+{\ttfamily \#include $<$util.\+h$>$}
+
+\doxysubsubsection*{Public Attributes}
+\begin{DoxyCompactItemize}
+\item
+\Hypertarget{structelem_a0d014510b9a1170af58e8516fb05b0b4}\label{structelem_a0d014510b9a1170af58e8516fb05b0b4}
+int {\bfseries value}
+\begin{DoxyCompactList}\small\item\em \texorpdfstring{$\ast$}{*}value phantom documentation \end{DoxyCompactList}\item
+\Hypertarget{structelem_aed06f2c7ef2050b131c8b72e099a0090}\label{structelem_aed06f2c7ef2050b131c8b72e099a0090}
+struct \mbox{\hyperlink{structelem}{elem}} \texorpdfstring{$\ast$}{*} {\bfseries prev}
+\begin{DoxyCompactList}\small\item\em \texorpdfstring{$\ast$}{*}prev phantom documentation \end{DoxyCompactList}\item
+\Hypertarget{structelem_ab9cf5c2e1c9a0ec2938275b90d39d5ca}\label{structelem_ab9cf5c2e1c9a0ec2938275b90d39d5ca}
+struct \mbox{\hyperlink{structelem}{elem}} \texorpdfstring{$\ast$}{*} {\bfseries next}
+\begin{DoxyCompactList}\small\item\em \texorpdfstring{$\ast$}{*}next phantom documentation \end{DoxyCompactList}\end{DoxyCompactItemize}
+
+
+\doxysubsection{Detailed Description}
+phantom documentation used to test the functioning of doxygen
+
+The documentation for this struct was generated from the following file\+:\begin{DoxyCompactItemize}
+\item
+include/util.\+h\end{DoxyCompactItemize}
diff --git a/doc/latex/d1/d04/structdblist.tex b/doc/latex/d1/d04/structdblist.tex
new file mode 100644
index 0000000..7583a6f
--- /dev/null
+++ b/doc/latex/d1/d04/structdblist.tex
@@ -0,0 +1,28 @@
+\doxysection{dblist Struct Reference}
+\hypertarget{structdblist}{}\label{structdblist}\index{dblist@{dblist}}
+
+
+phantom documentation used to test the functioning of doxygen
+
+
+
+
+{\ttfamily \#include $<$util.\+h$>$}
+
+\doxysubsubsection*{Public Attributes}
+\begin{DoxyCompactItemize}
+\item
+\Hypertarget{structdblist_a14615ff4b03d8f42730257cba4c50a1d}\label{structdblist_a14615ff4b03d8f42730257cba4c50a1d}
+\mbox{\hyperlink{structelem}{elem}} \texorpdfstring{$\ast$}{*} {\bfseries first}
+\begin{DoxyCompactList}\small\item\em \texorpdfstring{$\ast$}{*}first phantom documentation \end{DoxyCompactList}\item
+\Hypertarget{structdblist_ab5a72762ee26deb694dc0c89fdbda49f}\label{structdblist_ab5a72762ee26deb694dc0c89fdbda49f}
+\mbox{\hyperlink{structelem}{elem}} \texorpdfstring{$\ast$}{*} {\bfseries last}
+\begin{DoxyCompactList}\small\item\em \texorpdfstring{$\ast$}{*}last phantom documentation \end{DoxyCompactList}\end{DoxyCompactItemize}
+
+
+\doxysubsection{Detailed Description}
+phantom documentation used to test the functioning of doxygen
+
+The documentation for this struct was generated from the following file\+:\begin{DoxyCompactItemize}
+\item
+include/util.\+h\end{DoxyCompactItemize}
diff --git a/doc/latex/d1/d07/structfsm__struct__list__disp.tex b/doc/latex/d1/d07/structfsm__struct__list__disp.tex
new file mode 100644
index 0000000..cb8571f
--- /dev/null
+++ b/doc/latex/d1/d07/structfsm__struct__list__disp.tex
@@ -0,0 +1,28 @@
+\doxysection{fsm\+\_\+struct\+\_\+list\+\_\+disp Struct Reference}
+\hypertarget{structfsm__struct__list__disp}{}\label{structfsm__struct__list__disp}\index{fsm\_struct\_list\_disp@{fsm\_struct\_list\_disp}}
+
+
+phantom documentation used to test the functioning of doxygen
+
+
+
+
+{\ttfamily \#include $<$fsm.\+h$>$}
+
+\doxysubsubsection*{Public Attributes}
+\begin{DoxyCompactItemize}
+\item
+\Hypertarget{structfsm__struct__list__disp_ae353ad2d0881411adb27e870dcbc45f8}\label{structfsm__struct__list__disp_ae353ad2d0881411adb27e870dcbc45f8}
+int {\bfseries value}
+\begin{DoxyCompactList}\small\item\em \texorpdfstring{$\ast$}{*}value phantom documentation \end{DoxyCompactList}\item
+\Hypertarget{structfsm__struct__list__disp_a46c8b210279be9ac51265cbddf4658cb}\label{structfsm__struct__list__disp_a46c8b210279be9ac51265cbddf4658cb}
+struct \mbox{\hyperlink{structfsm__struct__list__disp}{fsm\+\_\+struct\+\_\+list\+\_\+disp}} \texorpdfstring{$\ast$}{*} {\bfseries suiv}
+\begin{DoxyCompactList}\small\item\em \texorpdfstring{$\ast$}{*}suiv phantom documentation \end{DoxyCompactList}\end{DoxyCompactItemize}
+
+
+\doxysubsection{Detailed Description}
+phantom documentation used to test the functioning of doxygen
+
+The documentation for this struct was generated from the following file\+:\begin{DoxyCompactItemize}
+\item
+include/fsm.\+h\end{DoxyCompactItemize}
diff --git a/doc/latex/d1/d09/structTreeNode__t.tex b/doc/latex/d1/d09/structTreeNode__t.tex
new file mode 100644
index 0000000..defd22d
--- /dev/null
+++ b/doc/latex/d1/d09/structTreeNode__t.tex
@@ -0,0 +1,31 @@
+\doxysection{Tree\+Node\+\_\+t Struct Reference}
+\hypertarget{structTreeNode__t}{}\label{structTreeNode__t}\index{TreeNode\_t@{TreeNode\_t}}
+
+
+phantom documentation used to test the functioning of doxygen
+
+
+
+
+{\ttfamily \#include $<$widget.\+h$>$}
+
+\doxysubsubsection*{Public Attributes}
+\begin{DoxyCompactItemize}
+\item
+\Hypertarget{structTreeNode__t_a5e4889026cb6802484a6a5dfc87d2543}\label{structTreeNode__t_a5e4889026cb6802484a6a5dfc87d2543}
+gchar \texorpdfstring{$\ast$}{*} {\bfseries text}
+\begin{DoxyCompactList}\small\item\em \texorpdfstring{$\ast$}{*}text phantom documentation \end{DoxyCompactList}\item
+\Hypertarget{structTreeNode__t_a7b289d9cc907d24c4c61bc7a2e769383}\label{structTreeNode__t_a7b289d9cc907d24c4c61bc7a2e769383}
+struct \mbox{\hyperlink{structTreeNode__t}{Tree\+Node\+\_\+t}} \texorpdfstring{$\ast$}{*} {\bfseries child}
+\begin{DoxyCompactList}\small\item\em \texorpdfstring{$\ast$}{*}child phantom documentation \end{DoxyCompactList}\item
+\Hypertarget{structTreeNode__t_abf009b430b98b8b70739e90bceddb34b}\label{structTreeNode__t_abf009b430b98b8b70739e90bceddb34b}
+struct \mbox{\hyperlink{structTreeNode__t}{Tree\+Node\+\_\+t}} \texorpdfstring{$\ast$}{*} {\bfseries next}
+\begin{DoxyCompactList}\small\item\em \texorpdfstring{$\ast$}{*}next phantom documentation \end{DoxyCompactList}\end{DoxyCompactItemize}
+
+
+\doxysubsection{Detailed Description}
+phantom documentation used to test the functioning of doxygen
+
+The documentation for this struct was generated from the following file\+:\begin{DoxyCompactItemize}
+\item
+include/widget.\+h\end{DoxyCompactItemize}
diff --git a/doc/latex/d3/d03/structarrow__t.tex b/doc/latex/d3/d03/structarrow__t.tex
new file mode 100644
index 0000000..6ed8850
--- /dev/null
+++ b/doc/latex/d3/d03/structarrow__t.tex
@@ -0,0 +1,37 @@
+\doxysection{arrow\+\_\+t Struct Reference}
+\hypertarget{structarrow__t}{}\label{structarrow__t}\index{arrow\_t@{arrow\_t}}
+
+
+phantom documentation used to test the functioning of doxygen
+
+
+
+
+{\ttfamily \#include $<$base.\+h$>$}
+
+\doxysubsubsection*{Public Attributes}
+\begin{DoxyCompactItemize}
+\item
+\Hypertarget{structarrow__t_aab59a759430a26ffb233554f93a1af0a}\label{structarrow__t_aab59a759430a26ffb233554f93a1af0a}
+uint {\bfseries load}
+\begin{DoxyCompactList}\small\item\em load phantom documentation \end{DoxyCompactList}\item
+\Hypertarget{structarrow__t_a786d036972b09f652b6dc73af77aaee0}\label{structarrow__t_a786d036972b09f652b6dc73af77aaee0}
+uint {\bfseries site}
+\begin{DoxyCompactList}\small\item\em site phantom documentation \end{DoxyCompactList}\item
+\Hypertarget{structarrow__t_a848949ce2dea0b41734058d0e9447630}\label{structarrow__t_a848949ce2dea0b41734058d0e9447630}
+uint {\bfseries x}
+\begin{DoxyCompactList}\small\item\em x phantom documentation \end{DoxyCompactList}\item
+\Hypertarget{structarrow__t_a5afadb806f219b228d198585238ade29}\label{structarrow__t_a5afadb806f219b228d198585238ade29}
+uint {\bfseries y}
+\begin{DoxyCompactList}\small\item\em y phantom documentation \end{DoxyCompactList}\item
+\Hypertarget{structarrow__t_a22f69e050d4fe1ddc0eda9a8024f832f}\label{structarrow__t_a22f69e050d4fe1ddc0eda9a8024f832f}
+uint {\bfseries z}
+\begin{DoxyCompactList}\small\item\em z phantom documentation \end{DoxyCompactList}\end{DoxyCompactItemize}
+
+
+\doxysubsection{Detailed Description}
+phantom documentation used to test the functioning of doxygen
+
+The documentation for this struct was generated from the following file\+:\begin{DoxyCompactItemize}
+\item
+include/base.\+h\end{DoxyCompactItemize}
diff --git a/doc/latex/d3/d0f/structpreferences.tex b/doc/latex/d3/d0f/structpreferences.tex
new file mode 100644
index 0000000..0c2d627
--- /dev/null
+++ b/doc/latex/d3/d0f/structpreferences.tex
@@ -0,0 +1,23 @@
+\doxysection{preferences Struct Reference}
+\hypertarget{structpreferences}{}\label{structpreferences}\index{preferences@{preferences}}
+
+
+use this ? static const char \texorpdfstring{$\ast$}{*}icon\+\_\+name \mbox{[}3\mbox{]} = \{ "{}document-\/revert-\/rtl-\/symbolic"{}, "{}edit-\/undo-\/symbolic"{}, "{}view-\/refresh-\/symbolic"{} \};
+
+
+\doxysubsubsection*{Public Attributes}
+\begin{DoxyCompactItemize}
+\item
+\Hypertarget{structpreferences_afac6511cae5d2491eb12406c2eca230d}\label{structpreferences_afac6511cae5d2491eb12406c2eca230d}
+int {\bfseries transparency} \mbox{[}n\+\_\+objects\mbox{]}
+\begin{DoxyCompactList}\small\item\em transparency \mbox{[}n\+\_\+objects\mbox{]} phantom documentation \end{DoxyCompactList}\end{DoxyCompactItemize}
+
+
+\doxysubsection{Detailed Description}
+use this ? static const char \texorpdfstring{$\ast$}{*}icon\+\_\+name \mbox{[}3\mbox{]} = \{ "{}document-\/revert-\/rtl-\/symbolic"{}, "{}edit-\/undo-\/symbolic"{}, "{}view-\/refresh-\/symbolic"{} \};
+
+const char {\itshape fsm\+\_\+get\+\_\+button\+\_\+icon\+\_\+name (int n) \{return (const char}) icon\+\_\+name \mbox{[}n\mbox{]};\} phantom documentation used to test the functioning of doxygen
+
+The documentation for this struct was generated from the following file\+:\begin{DoxyCompactItemize}
+\item
+src/fsm/preferences/\mbox{\hyperlink{preferences_2manager_8c}{manager.\+c}}\end{DoxyCompactItemize}
diff --git a/doc/latex/d4/d07/fsm_2dispatch_8c.tex b/doc/latex/d4/d07/fsm_2dispatch_8c.tex
new file mode 100644
index 0000000..d4d264e
--- /dev/null
+++ b/doc/latex/d4/d07/fsm_2dispatch_8c.tex
@@ -0,0 +1,401 @@
+\doxysection{src/fsm/dispatch.c File Reference}
+\hypertarget{fsm_2dispatch_8c}{}\label{fsm_2dispatch_8c}\index{src/fsm/dispatch.c@{src/fsm/dispatch.c}}
+
+
+
+\begin{DoxyItemize}
+\item OOOOOOOOOOO OOOOO OOO OOO \texorpdfstring{$\ast$}{*} OO OO OO OOOO OOOO \texorpdfstring{$\ast$}{*} OO OO OO OO OO OO \texorpdfstring{$\ast$}{*} OOOOOO OO OO OO OO OO \texorpdfstring{$\ast$}{*} OO OO OO OOO OO \texorpdfstring{$\ast$}{*} OO OO OO OO \texorpdfstring{$\ast$}{*} OO OO OOO OO OO \texorpdfstring{$\ast$}{*} OO OOOOOO OO OO \texorpdfstring{$\ast$}{*}
+\begin{DoxyItemize}
+\item
+\end{DoxyItemize}
+\end{DoxyItemize}
+
+
+{\ttfamily \#include $<$stdbool.\+h$>$}\newline
+{\ttfamily \#include "{}../../include/fsm.\+h"{}}\newline
+{\ttfamily \#include "{}../../include/util.\+h"{}}\newline
+{\ttfamily \#include "{}../../include/widget.\+h"{}}\newline
+\doxysubsubsection*{Functions}
+\begin{DoxyCompactItemize}
+\item
+void \mbox{\hyperlink{fsm_2dispatch_8c_a435d1a5171a7d69662d701234722fee2}{fsm\+\_\+journal\+\_\+publication\+\_\+request}} ()
+\begin{DoxyCompactList}\small\item\em The \doxylink{fsm_2dispatch_8c_a435d1a5171a7d69662d701234722fee2}{fsm\+\_\+journal\+\_\+publication\+\_\+request()} is called only once, by \doxylink{main_8c_a3c04138a5bfe5d72780bb7e82a18e627}{main()}, just after closing the app and before ending the program. \end{DoxyCompactList}\item
+void \mbox{\hyperlink{fsm_2dispatch_8c_a8c67f42f95d48ee2469c9a27d65db3e6}{fsm\+\_\+journal\+\_\+event}} (int severity, int source, const char \texorpdfstring{$\ast$}{*}file\+\_\+source, const char \texorpdfstring{$\ast$}{*}function\+\_\+source, const char \texorpdfstring{$\ast$}{*}string\+\_\+value)
+\begin{DoxyCompactList}\small\item\em It is mandatory for any event to call this function to be published in the journal. \end{DoxyCompactList}\item
+void \mbox{\hyperlink{fsm_2dispatch_8c_a8d91f5868f20ad3b72cfa63787d87444}{fsm\+\_\+init}} (char \texorpdfstring{$\ast$}{*}initial\+\_\+message\+\_\+from\+\_\+main)
+\begin{DoxyCompactList}\small\item\em F S M I N I T \texorpdfstring{$\ast$}{*}. \end{DoxyCompactList}\item
+void \mbox{\hyperlink{fsm_2dispatch_8c_a770bcaeb0bd6f81cddcc3cd506468fff}{fsm\+\_\+set\+\_\+preferences\+\_\+modified}} (bool value)
+\begin{DoxyCompactList}\small\item\em setter for the static boolean\+: \textquotesingle{}preferences\+\_\+have\+\_\+been\+\_\+modified\textquotesingle{} \end{DoxyCompactList}\item
+bool \mbox{\hyperlink{fsm_2dispatch_8c_a0b0231a311d0e85723ef9fcf38be88e3}{fsm\+\_\+get\+\_\+preferences\+\_\+state}} ()
+\begin{DoxyCompactList}\small\item\em getter for the static boolean\+: \textquotesingle{}preferences\+\_\+have\+\_\+been\+\_\+modified\textquotesingle{} \end{DoxyCompactList}\item
+int \mbox{\hyperlink{fsm_2dispatch_8c_a9123915ffd10fe1ae18254898b1c0ebf}{fsm\+\_\+get\+\_\+exec\+\_\+edit}} ()
+\begin{DoxyCompactList}\small\item\em Any function that modifies the client window must obtain this boolean. \end{DoxyCompactList}\item
+int \mbox{\hyperlink{fsm_2dispatch_8c_a90ab14081a88752d3721947a4922ee25}{fsm\+\_\+get\+\_\+state\+\_\+rules\+\_\+data}} ()
+\begin{DoxyCompactList}\small\item\em Any function that modifies the client window must obtain this value. \end{DoxyCompactList}\item
+void \mbox{\hyperlink{fsm_2dispatch_8c_ae921ecd39af67bb8dc0deb2cdc86125d}{fsm\+\_\+set\+\_\+exec\+\_\+edit}} (int choice)
+\begin{DoxyCompactList}\small\item\em setter for the static value\+: \textquotesingle{}choice\+\_\+\+STATE\+\_\+\+RULES\+\_\+\+DATA\textquotesingle{} (in this file) \end{DoxyCompactList}\item
+void \mbox{\hyperlink{fsm_2dispatch_8c_af5a464b19589ba1972c9b3aa3397945a}{fsm\+\_\+set\+\_\+state\+\_\+rules\+\_\+data}} (int choice)
+\begin{DoxyCompactList}\small\item\em setter for the static value\+: \textquotesingle{}choice\+\_\+\+STATE\+\_\+\+RULES\+\_\+\+DATA\textquotesingle{} (in this file) \end{DoxyCompactList}\end{DoxyCompactItemize}
+
+
+\doxysubsection{Detailed Description}
+
+\begin{DoxyItemize}
+\item OOOOOOOOOOO OOOOO OOO OOO \texorpdfstring{$\ast$}{*} OO OO OO OOOO OOOO \texorpdfstring{$\ast$}{*} OO OO OO OO OO OO \texorpdfstring{$\ast$}{*} OOOOOO OO OO OO OO OO \texorpdfstring{$\ast$}{*} OO OO OO OOO OO \texorpdfstring{$\ast$}{*} OO OO OO OO \texorpdfstring{$\ast$}{*} OO OO OOO OO OO \texorpdfstring{$\ast$}{*} OO OOOOOO OO OO \texorpdfstring{$\ast$}{*}
+\begin{DoxyItemize}
+\item
+\end{DoxyItemize}
+\end{DoxyItemize}
+
+This Finite State Machine (fsm) describes all the possible states of the Gem-\/graph client and all the transitions between these states.
+
+gem-\/graph-\/client fsm (Finite State Machine) manages four topics\+:
+\begin{DoxyItemize}
+\item engine (window appearance)
+\item measures (current measurements)
+\item results (current data acquisition and displays)
+\item preferences (current user preferences)
+\end{DoxyItemize}
+
+Each state of the finite state machine (fsm) is a combination of their states.
+
+It must be
+\begin{DoxyItemize}
+\item saved at the end of a work session and
+\item reread (available) at the start of a new session.
+\end{DoxyItemize}
+
+No state of the fsm should be defined in another module. No fsm transition needs to be executed in another module.
+
+The journal is created, edited and published from here.
+
+\doxysubsection{Function Documentation}
+\Hypertarget{fsm_2dispatch_8c_a9123915ffd10fe1ae18254898b1c0ebf}\label{fsm_2dispatch_8c_a9123915ffd10fe1ae18254898b1c0ebf}
+\index{dispatch.c@{dispatch.c}!fsm\_get\_exec\_edit@{fsm\_get\_exec\_edit}}
+\index{fsm\_get\_exec\_edit@{fsm\_get\_exec\_edit}!dispatch.c@{dispatch.c}}
+\doxysubsubsection{\texorpdfstring{fsm\_get\_exec\_edit()}{fsm\_get\_exec\_edit()}}
+{\footnotesize\ttfamily int fsm\+\_\+get\+\_\+exec\+\_\+edit (\begin{DoxyParamCaption}{ }\end{DoxyParamCaption})}
+
+
+
+Any function that modifies the client window must obtain this boolean.
+
+The \textquotesingle{}state\textquotesingle{} and \textquotesingle{}rules\textquotesingle{} pages appearance depends heavily on this.
+
+see include/fsm enum fsm\+\_\+enum\+\_\+exec\+\_\+edit \{ EXEC, EDIT \} The current int may be replaced by a boolean before publication. TODO
+
+\begin{DoxyDate}{Date}
+2024-\/08
+\end{DoxyDate}
+\begin{DoxyAuthor}{Author}
+Jean
+\end{DoxyAuthor}
+\begin{DoxySeeAlso}{See also}
+src/widget/one\+\_\+rule/dispatch
+
+src/widget/state/dispatch \texorpdfstring{$\ast$}{*} 2
+
+src/signal
+
+include/fsm enum fsm\+\_\+enum\+\_\+exec\+\_\+edit \{ EXEC, EDIT \} \texorpdfstring{$<$}{<}\texorpdfstring{$<$}{<} TODO check this
+\end{DoxySeeAlso}
+\begin{DoxyReturn}{Returns}
+choice\+\_\+\+EXEC\+\_\+\+EDIT
+\end{DoxyReturn}
+\Hypertarget{fsm_2dispatch_8c_a0b0231a311d0e85723ef9fcf38be88e3}\label{fsm_2dispatch_8c_a0b0231a311d0e85723ef9fcf38be88e3}
+\index{dispatch.c@{dispatch.c}!fsm\_get\_preferences\_state@{fsm\_get\_preferences\_state}}
+\index{fsm\_get\_preferences\_state@{fsm\_get\_preferences\_state}!dispatch.c@{dispatch.c}}
+\doxysubsubsection{\texorpdfstring{fsm\_get\_preferences\_state()}{fsm\_get\_preferences\_state()}}
+{\footnotesize\ttfamily bool fsm\+\_\+get\+\_\+preferences\+\_\+state (\begin{DoxyParamCaption}{ }\end{DoxyParamCaption})}
+
+
+
+getter for the static boolean\+: \textquotesingle{}preferences\+\_\+have\+\_\+been\+\_\+modified\textquotesingle{}
+
+\begin{DoxyDate}{Date}
+2024-\/08
+\end{DoxyDate}
+\begin{DoxyAuthor}{Author}
+Jean
+\end{DoxyAuthor}
+\begin{DoxySeeAlso}{See also}
+TODO A function must obtain this boolean when it stores the current state of the fsm (including \doxylink{structpreferences}{preferences}) before closing the current session.
+
+(none)
+\end{DoxySeeAlso}
+\begin{DoxyReturn}{Returns}
+preferences\+\_\+have\+\_\+been\+\_\+modified
+\end{DoxyReturn}
+\Hypertarget{fsm_2dispatch_8c_a90ab14081a88752d3721947a4922ee25}\label{fsm_2dispatch_8c_a90ab14081a88752d3721947a4922ee25}
+\index{dispatch.c@{dispatch.c}!fsm\_get\_state\_rules\_data@{fsm\_get\_state\_rules\_data}}
+\index{fsm\_get\_state\_rules\_data@{fsm\_get\_state\_rules\_data}!dispatch.c@{dispatch.c}}
+\doxysubsubsection{\texorpdfstring{fsm\_get\_state\_rules\_data()}{fsm\_get\_state\_rules\_data()}}
+{\footnotesize\ttfamily int fsm\+\_\+get\+\_\+state\+\_\+rules\+\_\+data (\begin{DoxyParamCaption}{ }\end{DoxyParamCaption})}
+
+
+
+Any function that modifies the client window must obtain this value.
+
+The pages selection and the window appearance depends heavily on this.
+
+see include/fsm enum fsm\+\_\+enum\+\_\+state\+\_\+rules\+\_\+data \{ SYNTH, STATE, RULES, DATA \}
+
+\begin{DoxyDate}{Date}
+2024-\/08
+\end{DoxyDate}
+\begin{DoxyAuthor}{Author}
+Jean
+\end{DoxyAuthor}
+\begin{DoxySeeAlso}{See also}
+src/widget/topbar/left
+
+src/signal
+
+(none)
+\end{DoxySeeAlso}
+\begin{DoxyReturn}{Returns}
+choice\+\_\+\+STATE\+\_\+\+RULES\+\_\+\+DATA
+\end{DoxyReturn}
+\Hypertarget{fsm_2dispatch_8c_a8d91f5868f20ad3b72cfa63787d87444}\label{fsm_2dispatch_8c_a8d91f5868f20ad3b72cfa63787d87444}
+\index{dispatch.c@{dispatch.c}!fsm\_init@{fsm\_init}}
+\index{fsm\_init@{fsm\_init}!dispatch.c@{dispatch.c}}
+\doxysubsubsection{\texorpdfstring{fsm\_init()}{fsm\_init()}}
+{\footnotesize\ttfamily void fsm\+\_\+init (\begin{DoxyParamCaption}\item[{char \texorpdfstring{$\ast$}{*}}]{initial\+\_\+message\+\_\+from\+\_\+main }\end{DoxyParamCaption})}
+
+
+
+F S M I N I T \texorpdfstring{$\ast$}{*}.
+
+This is the first function called by \textquotesingle{}\doxylink{main_8c}{main.\+c}\textquotesingle{} It initiates the journal and four lists which are\+: \textquotesingle{}measures\textquotesingle{}, \textquotesingle{}results\textquotesingle{}, \textquotesingle{}displayables results\textquotesingle{} and \textquotesingle{}preferences\textquotesingle{}. These lists will be used to define the current state of the fsm.
+
+\begin{DoxyDate}{Date}
+2024-\/08
+\end{DoxyDate}
+\begin{DoxyAuthor}{Author}
+Jean
+\end{DoxyAuthor}
+\begin{DoxySeeAlso}{See also}
+src/main/main()
+
+src/journal/fsm\+\_\+journal\+\_\+init()
+
+src/fsm/dispatch/fsm\+\_\+journal\+\_\+event()
+
+src/fsm/measures/manager/fsm\+\_\+list\+\_\+init\+\_\+measures()
+
+src/fsm/results/manager/fsm\+\_\+list\+\_\+init\+\_\+results()
+
+src/fsm/preferences/manager/fsm\+\_\+list\+\_\+init\+\_\+displayables()
+
+src/fsm/preferences/manager/fsm\+\_\+list\+\_\+init\+\_\+preferences()
+\end{DoxySeeAlso}
+
+\begin{DoxyParams}{Parameters}
+{\em \texorpdfstring{$\ast$}{*}initial\+\_\+message\+\_\+from\+\_\+main} & \\
+\hline
+\end{DoxyParams}
+\Hypertarget{fsm_2dispatch_8c_a8c67f42f95d48ee2469c9a27d65db3e6}\label{fsm_2dispatch_8c_a8c67f42f95d48ee2469c9a27d65db3e6}
+\index{dispatch.c@{dispatch.c}!fsm\_journal\_event@{fsm\_journal\_event}}
+\index{fsm\_journal\_event@{fsm\_journal\_event}!dispatch.c@{dispatch.c}}
+\doxysubsubsection{\texorpdfstring{fsm\_journal\_event()}{fsm\_journal\_event()}}
+{\footnotesize\ttfamily void fsm\+\_\+journal\+\_\+event (\begin{DoxyParamCaption}\item[{int}]{severity, }\item[{int}]{source, }\item[{const char \texorpdfstring{$\ast$}{*}}]{file\+\_\+source, }\item[{const char \texorpdfstring{$\ast$}{*}}]{function\+\_\+source, }\item[{const char \texorpdfstring{$\ast$}{*}}]{string\+\_\+value }\end{DoxyParamCaption})}
+
+
+
+It is mandatory for any event to call this function to be published in the journal.
+
+Before publication, a filter can be applied here (and only here) to select only some events of interest (during debugging, for example).
+
+If there are too many events, a filter can be applied here to select a few interesting events for publication in the log.
+
+This filter can operate on any the following five parameters\+: severity, source, \texorpdfstring{$\ast$}{*}file\+\_\+source, \texorpdfstring{$\ast$}{*}function\+\_\+source, \texorpdfstring{$\ast$}{*}string\+\_\+value. \begin{DoxySeeAlso}{See also}
+below (params)
+\end{DoxySeeAlso}
+Simple filters (on a single parameter) can be combined using the logical operators \textquotesingle{}and\textquotesingle{} and \textquotesingle{}or\textquotesingle{} and parentheses.
+
+Use\+: \$ grep -\/r "{}fsm\+\_\+journal\+\_\+event"{} to confirm the callergraph calls.
+
+\begin{DoxyDate}{Date}
+2024-\/08
+\end{DoxyDate}
+\begin{DoxyAuthor}{Author}
+Jean
+\end{DoxyAuthor}
+\begin{DoxySeeAlso}{See also}
+src/journal.\+c/fsm\+\_\+journal\+\_\+push\+\_\+front()
+
+src/main/main()
+
+src/widget/topbar/modal.\+c
+
+src/widget/topbar/right.\+c
+
+src/widget/topbar/dialog.\+c
+
+src/widget/topbar/left.\+c
+
+src/widget/topbar/dispatch.\+c \texorpdfstring{$\ast$}{*} 3
+
+src/widget/one\+\_\+rule/dispatch.\+c
+
+src/widget/one\+\_\+rule/algebra/conditions.\+c \texorpdfstring{$\ast$}{*} 2
+
+src/widget/measure/dispatch.\+c
+
+src/widget/dispatch.\+c \texorpdfstring{$\ast$}{*} 3
+
+src/widget/all\+\_\+rules/dispatch.\+c
+
+\doxylink{preferences_2manager_8c}{src/fsm/preferences/manager.\+c} \texorpdfstring{$\ast$}{*} 8
+
+src/fsm/measures/manager.\+c \texorpdfstring{$\ast$}{*} 2
+
+src/fsm/measures/tools\+\_\+list.\+c \texorpdfstring{$\ast$}{*} 4
+
+\doxylink{fsm_2dispatch_8c}{src/fsm/dispatch.\+c} \texorpdfstring{$\ast$}{*} 10
+
+src/fsm/results/manager.\+c
+
+src/util/tree.\+c
+
+src/signal.\+c \texorpdfstring{$\ast$}{*} 38
+\end{DoxySeeAlso}
+
+\begin{DoxyParams}{Parameters}
+{\em severity} & \texorpdfstring{$<$}{<}\texorpdfstring{$>$}{>} \\
+\hline
+\end{DoxyParams}
+\begin{DoxySeeAlso}{See also}
+enum fsm\+\_\+enum\+\_\+journal\+\_\+severity in include/fsm.\+h \textquotesingle{}severity\textquotesingle{} is a pre-\/defined value that must be associated to each event. It ranges from zero to six \+: CRITICAL ERROR WARNING INFO MESSAGE DEBUG SPEW 0 1 2 3 4 5 6
+\end{DoxySeeAlso}
+
+\begin{DoxyParams}{Parameters}
+{\em source} & \texorpdfstring{$<$}{<}\texorpdfstring{$>$}{>} \\
+\hline
+\end{DoxyParams}
+\begin{DoxySeeAlso}{See also}
+enum fsm\+\_\+enum\+\_\+journal\+\_\+source in include/fsm.\+h \textquotesingle{}source\textquotesingle{} is a pre-\/defined value that can be associated to each event. It is not mandatory. It can be set to \textquotesingle{}NULL\textquotesingle{}.
+\end{DoxySeeAlso}
+
+\begin{DoxyParams}{Parameters}
+{\em \texorpdfstring{$\ast$}{*}file\+\_\+source} & \texorpdfstring{$<$}{<}\texorpdfstring{$>$}{>} the name of the file that emits the event. \\
+\hline
+{\em \texorpdfstring{$\ast$}{*}function\+\_\+source} & \texorpdfstring{$<$}{<}\texorpdfstring{$>$}{>} the function that emits the event. \\
+\hline
+{\em \texorpdfstring{$\ast$}{*}string\+\_\+value} & \texorpdfstring{$<$}{<}\texorpdfstring{$>$}{>} any value that can qualify the event and provides useful information when reading the log. \\
+\hline
+\end{DoxyParams}
+\Hypertarget{fsm_2dispatch_8c_a435d1a5171a7d69662d701234722fee2}\label{fsm_2dispatch_8c_a435d1a5171a7d69662d701234722fee2}
+\index{dispatch.c@{dispatch.c}!fsm\_journal\_publication\_request@{fsm\_journal\_publication\_request}}
+\index{fsm\_journal\_publication\_request@{fsm\_journal\_publication\_request}!dispatch.c@{dispatch.c}}
+\doxysubsubsection{\texorpdfstring{fsm\_journal\_publication\_request()}{fsm\_journal\_publication\_request()}}
+{\footnotesize\ttfamily void fsm\+\_\+journal\+\_\+publication\+\_\+request (\begin{DoxyParamCaption}{ }\end{DoxyParamCaption})}
+
+
+
+The \doxylink{fsm_2dispatch_8c_a435d1a5171a7d69662d701234722fee2}{fsm\+\_\+journal\+\_\+publication\+\_\+request()} is called only once, by \doxylink{main_8c_a3c04138a5bfe5d72780bb7e82a18e627}{main()}, just after closing the app and before ending the program.
+
+This is to guarantee the chronological order of the events in the journal.
+
+The log is modified for each event but events can be send asynchronously. This is why the journal is only published once, before the end of "{}main()"{}, Its chronological order is therefore guaranteed.
+
+src/journal.\+c/fsm\+\_\+journal\+\_\+publish() (called here) is the last function of the program to be executed.
+
+The \doxylink{structfsm__struct__journal}{fsm\+\_\+struct\+\_\+journal} (gg\+\_\+logs) is a static instance in this file. Therefore, all the functions that read or write it are in this file. This is to avoid uncontrolled operations on it.
+
+\begin{DoxyDate}{Date}
+2024-\/08
+\end{DoxyDate}
+\begin{DoxyAuthor}{Author}
+Jean
+\end{DoxyAuthor}
+\begin{DoxySeeAlso}{See also}
+src/main/main()
+
+src/journal/fsm\+\_\+journal\+\_\+publish()
+\end{DoxySeeAlso}
+\Hypertarget{fsm_2dispatch_8c_ae921ecd39af67bb8dc0deb2cdc86125d}\label{fsm_2dispatch_8c_ae921ecd39af67bb8dc0deb2cdc86125d}
+\index{dispatch.c@{dispatch.c}!fsm\_set\_exec\_edit@{fsm\_set\_exec\_edit}}
+\index{fsm\_set\_exec\_edit@{fsm\_set\_exec\_edit}!dispatch.c@{dispatch.c}}
+\doxysubsubsection{\texorpdfstring{fsm\_set\_exec\_edit()}{fsm\_set\_exec\_edit()}}
+{\footnotesize\ttfamily void fsm\+\_\+set\+\_\+exec\+\_\+edit (\begin{DoxyParamCaption}\item[{int}]{choice }\end{DoxyParamCaption})}
+
+
+
+setter for the static value\+: \textquotesingle{}choice\+\_\+\+STATE\+\_\+\+RULES\+\_\+\+DATA\textquotesingle{} (in this file)
+
+see include/fsm enum fsm\+\_\+enum\+\_\+exec\+\_\+edit \{ EXEC, EDIT \}
+
+\begin{DoxyDate}{Date}
+2024-\/08
+\end{DoxyDate}
+\begin{DoxyAuthor}{Author}
+Jean
+\end{DoxyAuthor}
+\begin{DoxySeeAlso}{See also}
+(none)
+
+src/signal \texorpdfstring{$\ast$}{*} 2
+\end{DoxySeeAlso}
+
+\begin{DoxyParams}{Parameters}
+{\em choice} & \texorpdfstring{$<$}{<} a boolean value which can be "{}\+EXEC"{} or "{}\+EDIT"{} \\
+\hline
+\end{DoxyParams}
+\Hypertarget{fsm_2dispatch_8c_a770bcaeb0bd6f81cddcc3cd506468fff}\label{fsm_2dispatch_8c_a770bcaeb0bd6f81cddcc3cd506468fff}
+\index{dispatch.c@{dispatch.c}!fsm\_set\_preferences\_modified@{fsm\_set\_preferences\_modified}}
+\index{fsm\_set\_preferences\_modified@{fsm\_set\_preferences\_modified}!dispatch.c@{dispatch.c}}
+\doxysubsubsection{\texorpdfstring{fsm\_set\_preferences\_modified()}{fsm\_set\_preferences\_modified()}}
+{\footnotesize\ttfamily void fsm\+\_\+set\+\_\+preferences\+\_\+modified (\begin{DoxyParamCaption}\item[{bool}]{value }\end{DoxyParamCaption})}
+
+
+
+setter for the static boolean\+: \textquotesingle{}preferences\+\_\+have\+\_\+been\+\_\+modified\textquotesingle{}
+
+\begin{DoxyDate}{Date}
+2024-\/08
+\end{DoxyDate}
+\begin{DoxyAuthor}{Author}
+Jean
+\end{DoxyAuthor}
+\begin{DoxySeeAlso}{See also}
+TODO To be used by any function that modifies the current user \doxylink{structpreferences}{preferences}
+
+\doxylink{fsm_2dispatch_8c_a8c67f42f95d48ee2469c9a27d65db3e6}{fsm\+\_\+journal\+\_\+event()}
+\end{DoxySeeAlso}
+
+\begin{DoxyParams}{Parameters}
+{\em value} & = TRUE if preferences\+\_\+have\+\_\+been\+\_\+modified. \\
+\hline
+\end{DoxyParams}
+\Hypertarget{fsm_2dispatch_8c_af5a464b19589ba1972c9b3aa3397945a}\label{fsm_2dispatch_8c_af5a464b19589ba1972c9b3aa3397945a}
+\index{dispatch.c@{dispatch.c}!fsm\_set\_state\_rules\_data@{fsm\_set\_state\_rules\_data}}
+\index{fsm\_set\_state\_rules\_data@{fsm\_set\_state\_rules\_data}!dispatch.c@{dispatch.c}}
+\doxysubsubsection{\texorpdfstring{fsm\_set\_state\_rules\_data()}{fsm\_set\_state\_rules\_data()}}
+{\footnotesize\ttfamily void fsm\+\_\+set\+\_\+state\+\_\+rules\+\_\+data (\begin{DoxyParamCaption}\item[{int}]{choice }\end{DoxyParamCaption})}
+
+
+
+setter for the static value\+: \textquotesingle{}choice\+\_\+\+STATE\+\_\+\+RULES\+\_\+\+DATA\textquotesingle{} (in this file)
+
+see include/fsm enum fsm\+\_\+enum\+\_\+state\+\_\+rules\+\_\+data \{ SYNTH, STATE, RULES, DATA \} Today (2024-\/10) the initial page is set to \textquotesingle{}SYNTH\textquotesingle{}. \begin{DoxySeeAlso}{See also}
+line 292 choice\+\_\+\+STATE\+\_\+\+RULES\+\_\+\+DATA = SYNTH; NB This choice can be temporarily modified for debugging purpose\+:
+
+end of the function\+: \doxylink{fsm_2dispatch_8c}{fsm/dispatch.\+c} window\+\_\+design\+\_\+topbar\+\_\+left()
+\end{DoxySeeAlso}
+\begin{DoxyDate}{Date}
+2024-\/08
+\end{DoxyDate}
+\begin{DoxyAuthor}{Author}
+Jean
+\end{DoxyAuthor}
+\begin{DoxySeeAlso}{See also}
+src/signal \texorpdfstring{$\ast$}{*} 4
+
+(none)
+\end{DoxySeeAlso}
+
+\begin{DoxyParams}{Parameters}
+{\em choice} & \\
+\hline
+\end{DoxyParams}
diff --git a/doc/latex/d5/d00/structfsm__struct__list__tool.tex b/doc/latex/d5/d00/structfsm__struct__list__tool.tex
new file mode 100644
index 0000000..307ba7b
--- /dev/null
+++ b/doc/latex/d5/d00/structfsm__struct__list__tool.tex
@@ -0,0 +1,28 @@
+\doxysection{fsm\+\_\+struct\+\_\+list\+\_\+tool Struct Reference}
+\hypertarget{structfsm__struct__list__tool}{}\label{structfsm__struct__list__tool}\index{fsm\_struct\_list\_tool@{fsm\_struct\_list\_tool}}
+
+
+phantom documentation used to test the functioning of doxygen
+
+
+
+
+{\ttfamily \#include $<$fsm.\+h$>$}
+
+\doxysubsubsection*{Public Attributes}
+\begin{DoxyCompactItemize}
+\item
+\Hypertarget{structfsm__struct__list__tool_a5f73a80ddae5f67ef8bbb161ae2c4259}\label{structfsm__struct__list__tool_a5f73a80ddae5f67ef8bbb161ae2c4259}
+int {\bfseries value}
+\begin{DoxyCompactList}\small\item\em \texorpdfstring{$\ast$}{*}value phantom documentation \end{DoxyCompactList}\item
+\Hypertarget{structfsm__struct__list__tool_ac6a36e7f389c23eb5404f0c5c3a4005a}\label{structfsm__struct__list__tool_ac6a36e7f389c23eb5404f0c5c3a4005a}
+struct \mbox{\hyperlink{structfsm__struct__list__tool}{fsm\+\_\+struct\+\_\+list\+\_\+tool}} \texorpdfstring{$\ast$}{*} {\bfseries suiv}
+\begin{DoxyCompactList}\small\item\em \texorpdfstring{$\ast$}{*}suiv phantom documentation \end{DoxyCompactList}\end{DoxyCompactItemize}
+
+
+\doxysubsection{Detailed Description}
+phantom documentation used to test the functioning of doxygen
+
+The documentation for this struct was generated from the following file\+:\begin{DoxyCompactItemize}
+\item
+include/fsm.\+h\end{DoxyCompactItemize}
diff --git a/doc/latex/d7/d02/structstack__index__t.tex b/doc/latex/d7/d02/structstack__index__t.tex
new file mode 100644
index 0000000..1bc4bca
--- /dev/null
+++ b/doc/latex/d7/d02/structstack__index__t.tex
@@ -0,0 +1,27 @@
+\doxysection{stack\+\_\+index\+\_\+t Struct Reference}
+\hypertarget{structstack__index__t}{}\label{structstack__index__t}\index{stack\_index\_t@{stack\_index\_t}}
+
+
+phantom documentation used to test the functioning of doxygen
+
+
+\doxysubsubsection*{Public Attributes}
+\begin{DoxyCompactItemize}
+\item
+\Hypertarget{structstack__index__t_ad0aae1e2bf45eb8855155ad713b4c3d4}\label{structstack__index__t_ad0aae1e2bf45eb8855155ad713b4c3d4}
+long {\bfseries stack\+\_\+id}
+\begin{DoxyCompactList}\small\item\em stack\+\_\+id phantom documentation \end{DoxyCompactList}\item
+\Hypertarget{structstack__index__t_a9b5ca3909ae086aa1ecbf4d581c2d596}\label{structstack__index__t_a9b5ca3909ae086aa1ecbf4d581c2d596}
+void \texorpdfstring{$\ast$}{*} {\bfseries container\+\_\+widget}
+\begin{DoxyCompactList}\small\item\em container\+\_\+widget phantom documentation \end{DoxyCompactList}\item
+\Hypertarget{structstack__index__t_af27d972a040feb4ad2c52e7575e85854}\label{structstack__index__t_af27d972a040feb4ad2c52e7575e85854}
+void \texorpdfstring{$\ast$}{*} {\bfseries gl\+\_\+area}
+\begin{DoxyCompactList}\small\item\em gl\+\_\+area phantom documentation \end{DoxyCompactList}\end{DoxyCompactItemize}
+
+
+\doxysubsection{Detailed Description}
+phantom documentation used to test the functioning of doxygen
+
+The documentation for this struct was generated from the following file\+:\begin{DoxyCompactItemize}
+\item
+src/util/draw/\mbox{\hyperlink{gl_8c}{gl.\+c}}\end{DoxyCompactItemize}
diff --git a/doc/latex/d7/d07/structStack.tex b/doc/latex/d7/d07/structStack.tex
new file mode 100644
index 0000000..8fd7000
--- /dev/null
+++ b/doc/latex/d7/d07/structStack.tex
@@ -0,0 +1,26 @@
+\doxysection{Stack Struct Reference}
+\hypertarget{structStack}{}\label{structStack}\index{Stack@{Stack}}
+
+
+struct images\+\_\+bff \{Gtk\+Widget \texorpdfstring{$\ast$}{*}arr\mbox{[}MAX\+\_\+\+SIZE\mbox{]}; int top;\}; static struct images\+\_\+bff \texorpdfstring{$\ast$}{*}my\+\_\+list = NULL;//, \texorpdfstring{$\ast$}{*}babar = NULL; static struct images\+\_\+bff \texorpdfstring{$\ast$}{*}alloc\+\_\+images\+\_\+bff () \{ struct images\+\_\+bff \texorpdfstring{$\ast$}{*}p; p = malloc (sizeof (struct images\+\_\+bff)); if (p == NULL) printf ("{}fatal\+: ran out of storage"{}); p-\/\texorpdfstring{$>$}{>}arr\mbox{[}MAX\+\_\+\+SIZE\mbox{]} = NULL; p-\/\texorpdfstring{$>$}{>}top = 0; return p; \} static void add\+\_\+to\+\_\+mylist (int my\+\_\+int) \{ struct images\+\_\+bff \texorpdfstring{$\ast$}{*}p = alloc\+\_\+images\+\_\+bff (); p-\/\texorpdfstring{$>$}{>}arr\mbox{[}MAX\+\_\+\+SIZE\mbox{]} = NULL; // TODO p-\/\texorpdfstring{$>$}{>}top = my\+\_\+int; my\+\_\+list = p; \} static void free\+\_\+intlist (struct images\+\_\+bff \texorpdfstring{$\ast$}{*}p) \{ TODO \} TODO free\+\_\+intlist (mylist); TODO mylist = NULL; TODO offsetof (type, field)
+
+
+\doxysubsubsection*{Public Attributes}
+\begin{DoxyCompactItemize}
+\item
+\Hypertarget{structStack_a9c232ff5046f7d60a7ec923326775590}\label{structStack_a9c232ff5046f7d60a7ec923326775590}
+Gtk\+Widget \texorpdfstring{$\ast$}{*} {\bfseries arr} \mbox{[}MAX\+\_\+\+SIZE\mbox{]}
+\begin{DoxyCompactList}\small\item\em \texorpdfstring{$\ast$}{*}arr\mbox{[}MAX\+\_\+\+SIZE\mbox{]} phantom documentation \end{DoxyCompactList}\item
+\Hypertarget{structStack_ad62fb36816185f3eef3a6f735a61f54a}\label{structStack_ad62fb36816185f3eef3a6f735a61f54a}
+int {\bfseries top}
+\begin{DoxyCompactList}\small\item\em top phantom documentation \end{DoxyCompactList}\end{DoxyCompactItemize}
+
+
+\doxysubsection{Detailed Description}
+struct images\+\_\+bff \{Gtk\+Widget \texorpdfstring{$\ast$}{*}arr\mbox{[}MAX\+\_\+\+SIZE\mbox{]}; int top;\}; static struct images\+\_\+bff \texorpdfstring{$\ast$}{*}my\+\_\+list = NULL;//, \texorpdfstring{$\ast$}{*}babar = NULL; static struct images\+\_\+bff \texorpdfstring{$\ast$}{*}alloc\+\_\+images\+\_\+bff () \{ struct images\+\_\+bff \texorpdfstring{$\ast$}{*}p; p = malloc (sizeof (struct images\+\_\+bff)); if (p == NULL) printf ("{}fatal\+: ran out of storage"{}); p-\/\texorpdfstring{$>$}{>}arr\mbox{[}MAX\+\_\+\+SIZE\mbox{]} = NULL; p-\/\texorpdfstring{$>$}{>}top = 0; return p; \} static void add\+\_\+to\+\_\+mylist (int my\+\_\+int) \{ struct images\+\_\+bff \texorpdfstring{$\ast$}{*}p = alloc\+\_\+images\+\_\+bff (); p-\/\texorpdfstring{$>$}{>}arr\mbox{[}MAX\+\_\+\+SIZE\mbox{]} = NULL; // TODO p-\/\texorpdfstring{$>$}{>}top = my\+\_\+int; my\+\_\+list = p; \} static void free\+\_\+intlist (struct images\+\_\+bff \texorpdfstring{$\ast$}{*}p) \{ TODO \} TODO free\+\_\+intlist (mylist); TODO mylist = NULL; TODO offsetof (type, field)
+
+phantom documentation used to test the functioning of doxygen
+
+The documentation for this struct was generated from the following file\+:\begin{DoxyCompactItemize}
+\item
+src/widget/all\+\_\+rules/compare/interest.\+c\end{DoxyCompactItemize}
diff --git a/doc/latex/d7/d08/structfsm__struct__journal__unit.tex b/doc/latex/d7/d08/structfsm__struct__journal__unit.tex
new file mode 100644
index 0000000..a1bba6f
--- /dev/null
+++ b/doc/latex/d7/d08/structfsm__struct__journal__unit.tex
@@ -0,0 +1,102 @@
+\doxysection{fsm\+\_\+struct\+\_\+journal\+\_\+unit Struct Reference}
+\hypertarget{structfsm__struct__journal__unit}{}\label{structfsm__struct__journal__unit}\index{fsm\_struct\_journal\_unit@{fsm\_struct\_journal\_unit}}
+
+
+phantom documentation used to test the functioning of doxygen
+
+
+
+
+{\ttfamily \#include $<$fsm.\+h$>$}
+
+\doxysubsubsection*{Public Attributes}
+\begin{DoxyCompactItemize}
+\item
+long \mbox{\hyperlink{structfsm__struct__journal__unit_a932a3e2c6c87e442213ec109eeaf9e8a}{yy\+\_\+dd\+\_\+mm}}
+\item
+long \mbox{\hyperlink{structfsm__struct__journal__unit_a15f25f19f95836422b016955e3923f4a}{usec}}
+\item
+const char \texorpdfstring{$\ast$}{*} \mbox{\hyperlink{structfsm__struct__journal__unit_a2354246a3b5139ffb1fc120ed85e5db7}{file\+\_\+source}}
+\item
+const char \texorpdfstring{$\ast$}{*} \mbox{\hyperlink{structfsm__struct__journal__unit_a6c0be2efbdca90fe39e16066256875cb}{function\+\_\+source}}
+\item
+const char \texorpdfstring{$\ast$}{*} \mbox{\hyperlink{structfsm__struct__journal__unit_ac9aa94406e089f89af0732db8d94b25f}{string\+\_\+value}}
+\item
+struct \mbox{\hyperlink{structfsm__struct__journal__unit}{fsm\+\_\+struct\+\_\+journal\+\_\+unit}} \texorpdfstring{$\ast$}{*} \mbox{\hyperlink{structfsm__struct__journal__unit_a7d5e9e10caadc69643112b5a4eeb2d75}{prev}}
+\item
+struct \mbox{\hyperlink{structfsm__struct__journal__unit}{fsm\+\_\+struct\+\_\+journal\+\_\+unit}} \texorpdfstring{$\ast$}{*} \mbox{\hyperlink{structfsm__struct__journal__unit_ab37616d51b850373be72bee05eaf73ca}{next}}
+\end{DoxyCompactItemize}
+
+
+\doxysubsection{Detailed Description}
+phantom documentation used to test the functioning of doxygen
+
+\doxysubsection{Member Data Documentation}
+\Hypertarget{structfsm__struct__journal__unit_a2354246a3b5139ffb1fc120ed85e5db7}\label{structfsm__struct__journal__unit_a2354246a3b5139ffb1fc120ed85e5db7}
+\index{fsm\_struct\_journal\_unit@{fsm\_struct\_journal\_unit}!file\_source@{file\_source}}
+\index{file\_source@{file\_source}!fsm\_struct\_journal\_unit@{fsm\_struct\_journal\_unit}}
+\doxysubsubsection{\texorpdfstring{file\_source}{file\_source}}
+{\footnotesize\ttfamily const char\texorpdfstring{$\ast$}{*} fsm\+\_\+struct\+\_\+journal\+\_\+unit\+::file\+\_\+source}
+
+
+\begin{DoxyItemize}
+\item phantom documentation
+\end{DoxyItemize}\Hypertarget{structfsm__struct__journal__unit_a6c0be2efbdca90fe39e16066256875cb}\label{structfsm__struct__journal__unit_a6c0be2efbdca90fe39e16066256875cb}
+\index{fsm\_struct\_journal\_unit@{fsm\_struct\_journal\_unit}!function\_source@{function\_source}}
+\index{function\_source@{function\_source}!fsm\_struct\_journal\_unit@{fsm\_struct\_journal\_unit}}
+\doxysubsubsection{\texorpdfstring{function\_source}{function\_source}}
+{\footnotesize\ttfamily const char\texorpdfstring{$\ast$}{*} fsm\+\_\+struct\+\_\+journal\+\_\+unit\+::function\+\_\+source}
+
+
+\begin{DoxyItemize}
+\item phantom documentation
+\end{DoxyItemize}\Hypertarget{structfsm__struct__journal__unit_ab37616d51b850373be72bee05eaf73ca}\label{structfsm__struct__journal__unit_ab37616d51b850373be72bee05eaf73ca}
+\index{fsm\_struct\_journal\_unit@{fsm\_struct\_journal\_unit}!next@{next}}
+\index{next@{next}!fsm\_struct\_journal\_unit@{fsm\_struct\_journal\_unit}}
+\doxysubsubsection{\texorpdfstring{next}{next}}
+{\footnotesize\ttfamily struct \mbox{\hyperlink{structfsm__struct__journal__unit}{fsm\+\_\+struct\+\_\+journal\+\_\+unit}}\texorpdfstring{$\ast$}{*} fsm\+\_\+struct\+\_\+journal\+\_\+unit\+::next}
+
+
+\begin{DoxyItemize}
+\item phantom documentation
+\end{DoxyItemize}\Hypertarget{structfsm__struct__journal__unit_a7d5e9e10caadc69643112b5a4eeb2d75}\label{structfsm__struct__journal__unit_a7d5e9e10caadc69643112b5a4eeb2d75}
+\index{fsm\_struct\_journal\_unit@{fsm\_struct\_journal\_unit}!prev@{prev}}
+\index{prev@{prev}!fsm\_struct\_journal\_unit@{fsm\_struct\_journal\_unit}}
+\doxysubsubsection{\texorpdfstring{prev}{prev}}
+{\footnotesize\ttfamily struct \mbox{\hyperlink{structfsm__struct__journal__unit}{fsm\+\_\+struct\+\_\+journal\+\_\+unit}}\texorpdfstring{$\ast$}{*} fsm\+\_\+struct\+\_\+journal\+\_\+unit\+::prev}
+
+
+\begin{DoxyItemize}
+\item phantom documentation
+\end{DoxyItemize}\Hypertarget{structfsm__struct__journal__unit_ac9aa94406e089f89af0732db8d94b25f}\label{structfsm__struct__journal__unit_ac9aa94406e089f89af0732db8d94b25f}
+\index{fsm\_struct\_journal\_unit@{fsm\_struct\_journal\_unit}!string\_value@{string\_value}}
+\index{string\_value@{string\_value}!fsm\_struct\_journal\_unit@{fsm\_struct\_journal\_unit}}
+\doxysubsubsection{\texorpdfstring{string\_value}{string\_value}}
+{\footnotesize\ttfamily const char\texorpdfstring{$\ast$}{*} fsm\+\_\+struct\+\_\+journal\+\_\+unit\+::string\+\_\+value}
+
+
+\begin{DoxyItemize}
+\item phantom documentation
+\end{DoxyItemize}\Hypertarget{structfsm__struct__journal__unit_a15f25f19f95836422b016955e3923f4a}\label{structfsm__struct__journal__unit_a15f25f19f95836422b016955e3923f4a}
+\index{fsm\_struct\_journal\_unit@{fsm\_struct\_journal\_unit}!usec@{usec}}
+\index{usec@{usec}!fsm\_struct\_journal\_unit@{fsm\_struct\_journal\_unit}}
+\doxysubsubsection{\texorpdfstring{usec}{usec}}
+{\footnotesize\ttfamily long fsm\+\_\+struct\+\_\+journal\+\_\+unit\+::usec}
+
+
+\begin{DoxyItemize}
+\item phantom documentation
+\end{DoxyItemize}\Hypertarget{structfsm__struct__journal__unit_a932a3e2c6c87e442213ec109eeaf9e8a}\label{structfsm__struct__journal__unit_a932a3e2c6c87e442213ec109eeaf9e8a}
+\index{fsm\_struct\_journal\_unit@{fsm\_struct\_journal\_unit}!yy\_dd\_mm@{yy\_dd\_mm}}
+\index{yy\_dd\_mm@{yy\_dd\_mm}!fsm\_struct\_journal\_unit@{fsm\_struct\_journal\_unit}}
+\doxysubsubsection{\texorpdfstring{yy\_dd\_mm}{yy\_dd\_mm}}
+{\footnotesize\ttfamily long fsm\+\_\+struct\+\_\+journal\+\_\+unit\+::yy\+\_\+dd\+\_\+mm}
+
+
+\begin{DoxyItemize}
+\item phantom documentation
+\end{DoxyItemize}
+
+The documentation for this struct was generated from the following file\+:\begin{DoxyCompactItemize}
+\item
+include/fsm.\+h\end{DoxyCompactItemize}
diff --git a/doc/latex/d9/d03/structfsm__struct__journal.tex b/doc/latex/d9/d03/structfsm__struct__journal.tex
new file mode 100644
index 0000000..143b836
--- /dev/null
+++ b/doc/latex/d9/d03/structfsm__struct__journal.tex
@@ -0,0 +1,47 @@
+\doxysection{fsm\+\_\+struct\+\_\+journal Struct Reference}
+\hypertarget{structfsm__struct__journal}{}\label{structfsm__struct__journal}\index{fsm\_struct\_journal@{fsm\_struct\_journal}}
+
+
+phantom documentation used to test the functioning of doxygen
+
+
+
+
+{\ttfamily \#include $<$fsm.\+h$>$}
+
+\doxysubsubsection*{Public Attributes}
+\begin{DoxyCompactItemize}
+\item
+\mbox{\hyperlink{structfsm__struct__journal__unit}{fsm\+\_\+struct\+\_\+journal\+\_\+unit}} \texorpdfstring{$\ast$}{*} \mbox{\hyperlink{structfsm__struct__journal_ac4fb89c8fb499c05f57978200d8628d9}{first}}
+\item
+\mbox{\hyperlink{structfsm__struct__journal__unit}{fsm\+\_\+struct\+\_\+journal\+\_\+unit}} \texorpdfstring{$\ast$}{*} \mbox{\hyperlink{structfsm__struct__journal_a3e55d9bb62c322d8e1ae5dc90d7a5f6d}{last}}
+\end{DoxyCompactItemize}
+
+
+\doxysubsection{Detailed Description}
+phantom documentation used to test the functioning of doxygen
+
+\doxysubsection{Member Data Documentation}
+\Hypertarget{structfsm__struct__journal_ac4fb89c8fb499c05f57978200d8628d9}\label{structfsm__struct__journal_ac4fb89c8fb499c05f57978200d8628d9}
+\index{fsm\_struct\_journal@{fsm\_struct\_journal}!first@{first}}
+\index{first@{first}!fsm\_struct\_journal@{fsm\_struct\_journal}}
+\doxysubsubsection{\texorpdfstring{first}{first}}
+{\footnotesize\ttfamily \mbox{\hyperlink{structfsm__struct__journal__unit}{fsm\+\_\+struct\+\_\+journal\+\_\+unit}}\texorpdfstring{$\ast$}{*} fsm\+\_\+struct\+\_\+journal\+::first}
+
+
+\begin{DoxyItemize}
+\item phantom documentation
+\end{DoxyItemize}\Hypertarget{structfsm__struct__journal_a3e55d9bb62c322d8e1ae5dc90d7a5f6d}\label{structfsm__struct__journal_a3e55d9bb62c322d8e1ae5dc90d7a5f6d}
+\index{fsm\_struct\_journal@{fsm\_struct\_journal}!last@{last}}
+\index{last@{last}!fsm\_struct\_journal@{fsm\_struct\_journal}}
+\doxysubsubsection{\texorpdfstring{last}{last}}
+{\footnotesize\ttfamily \mbox{\hyperlink{structfsm__struct__journal__unit}{fsm\+\_\+struct\+\_\+journal\+\_\+unit}}\texorpdfstring{$\ast$}{*} fsm\+\_\+struct\+\_\+journal\+::last}
+
+
+\begin{DoxyItemize}
+\item phantom documentation
+\end{DoxyItemize}
+
+The documentation for this struct was generated from the following file\+:\begin{DoxyCompactItemize}
+\item
+include/fsm.\+h\end{DoxyCompactItemize}
diff --git a/doc/latex/d9/d04/structfsm__struct__list__data.tex b/doc/latex/d9/d04/structfsm__struct__list__data.tex
new file mode 100644
index 0000000..fe8d8eb
--- /dev/null
+++ b/doc/latex/d9/d04/structfsm__struct__list__data.tex
@@ -0,0 +1,28 @@
+\doxysection{fsm\+\_\+struct\+\_\+list\+\_\+data Struct Reference}
+\hypertarget{structfsm__struct__list__data}{}\label{structfsm__struct__list__data}\index{fsm\_struct\_list\_data@{fsm\_struct\_list\_data}}
+
+
+phantom documentation used to test the functioning of doxygen
+
+
+
+
+{\ttfamily \#include $<$fsm.\+h$>$}
+
+\doxysubsubsection*{Public Attributes}
+\begin{DoxyCompactItemize}
+\item
+\Hypertarget{structfsm__struct__list__data_a5eb8634842969f2fd4581d364ab28cc1}\label{structfsm__struct__list__data_a5eb8634842969f2fd4581d364ab28cc1}
+int {\bfseries value}
+\begin{DoxyCompactList}\small\item\em \texorpdfstring{$\ast$}{*}value phantom documentation \end{DoxyCompactList}\item
+\Hypertarget{structfsm__struct__list__data_a190465361efd7dafe1ee1f489a272ac0}\label{structfsm__struct__list__data_a190465361efd7dafe1ee1f489a272ac0}
+struct \mbox{\hyperlink{structfsm__struct__list__data}{fsm\+\_\+struct\+\_\+list\+\_\+data}} \texorpdfstring{$\ast$}{*} {\bfseries suiv}
+\begin{DoxyCompactList}\small\item\em \texorpdfstring{$\ast$}{*}suiv phantom documentation \end{DoxyCompactList}\end{DoxyCompactItemize}
+
+
+\doxysubsection{Detailed Description}
+phantom documentation used to test the functioning of doxygen
+
+The documentation for this struct was generated from the following file\+:\begin{DoxyCompactItemize}
+\item
+include/fsm.\+h\end{DoxyCompactItemize}
diff --git a/doc/latex/d9/d06/preferences_2manager_8c.tex b/doc/latex/d9/d06/preferences_2manager_8c.tex
new file mode 100644
index 0000000..36870bc
--- /dev/null
+++ b/doc/latex/d9/d06/preferences_2manager_8c.tex
@@ -0,0 +1,34 @@
+\doxysection{src/fsm/preferences/manager.c File Reference}
+\hypertarget{preferences_2manager_8c}{}\label{preferences_2manager_8c}\index{src/fsm/preferences/manager.c@{src/fsm/preferences/manager.c}}
+{\ttfamily \#include "{}../../../include/fsm.\+h"{}}\newline
+{\ttfamily \#include "{}../../../include/signal.\+h"{}}\newline
+{\ttfamily \#include "{}../../../include/widget.\+h"{}}\newline
+\doxysubsubsection*{Classes}
+\begin{DoxyCompactItemize}
+\item
+struct \mbox{\hyperlink{structpreferences}{preferences}}
+\begin{DoxyCompactList}\small\item\em use this ? static const char \texorpdfstring{$\ast$}{*}icon\+\_\+name \mbox{[}3\mbox{]} = \{ "{}document-\/revert-\/rtl-\/symbolic"{}, "{}edit-\/undo-\/symbolic"{}, "{}view-\/refresh-\/symbolic"{} \}; \end{DoxyCompactList}\end{DoxyCompactItemize}
+\doxysubsubsection*{Functions}
+\begin{DoxyCompactItemize}
+\item
+\Hypertarget{preferences_2manager_8c_a42a491a3a432cf572b3c2ed84a00d927}\label{preferences_2manager_8c_a42a491a3a432cf572b3c2ed84a00d927}
+void {\bfseries fsm\+\_\+set\+\_\+store\+\_\+restore\+\_\+reset} (int choice, int value)
+\begin{DoxyCompactList}\small\item\em phantom documentation used to test the functioning of doxygen \end{DoxyCompactList}\item
+\Hypertarget{preferences_2manager_8c_abb1b857c9ec1ab39d6cb7cdf683a08d1}\label{preferences_2manager_8c_abb1b857c9ec1ab39d6cb7cdf683a08d1}
+void {\bfseries fsm\+\_\+reset\+\_\+all\+\_\+situations\+\_\+values} (int value)
+\begin{DoxyCompactList}\small\item\em phantom documentation used to test the functioning of doxygen \end{DoxyCompactList}\item
+\Hypertarget{preferences_2manager_8c_aa69a9ce07b26ad1863960c6f0d1303b5}\label{preferences_2manager_8c_aa69a9ce07b26ad1863960c6f0d1303b5}
+void {\bfseries fsm\+\_\+add\+\_\+displayable} (char \texorpdfstring{$\ast$}{*}displayable\+\_\+name)
+\begin{DoxyCompactList}\small\item\em phantom documentation used to test the functioning of doxygen \end{DoxyCompactList}\item
+\Hypertarget{preferences_2manager_8c_aa02db2c62f7507eabfcc9a41f0e660b6}\label{preferences_2manager_8c_aa02db2c62f7507eabfcc9a41f0e660b6}
+void {\bfseries fsm\+\_\+list\+\_\+init\+\_\+preferences} ()
+\begin{DoxyCompactList}\small\item\em phantom documentation used to test the functioning of doxygen \end{DoxyCompactList}\item
+\Hypertarget{preferences_2manager_8c_a8eaa768708ebc21d710a8cc6144af1d3}\label{preferences_2manager_8c_a8eaa768708ebc21d710a8cc6144af1d3}
+void {\bfseries fsm\+\_\+list\+\_\+init\+\_\+displayables} ()
+\begin{DoxyCompactList}\small\item\em phantom documentation used to test the functioning of doxygen \end{DoxyCompactList}\end{DoxyCompactItemize}
+\doxysubsubsection*{Variables}
+\begin{DoxyCompactItemize}
+\item
+\Hypertarget{preferences_2manager_8c_aca528e2aeb796176a06819e058557e72}\label{preferences_2manager_8c_aca528e2aeb796176a06819e058557e72}
+struct \mbox{\hyperlink{structpreferences}{preferences}} \texorpdfstring{$\ast$}{*} {\bfseries pref\+\_\+jean} = NULL
+\begin{DoxyCompactList}\small\item\em phantom documentation used to test the functioning of doxygen \end{DoxyCompactList}\end{DoxyCompactItemize}
diff --git a/doc/latex/da/d03/structpile.tex b/doc/latex/da/d03/structpile.tex
new file mode 100644
index 0000000..1f2be6e
--- /dev/null
+++ b/doc/latex/da/d03/structpile.tex
@@ -0,0 +1,28 @@
+\doxysection{pile Struct Reference}
+\hypertarget{structpile}{}\label{structpile}\index{pile@{pile}}
+
+
+phantom documentation used to test the functioning of doxygen
+
+
+
+
+{\ttfamily \#include $<$util.\+h$>$}
+
+\doxysubsubsection*{Public Attributes}
+\begin{DoxyCompactItemize}
+\item
+\Hypertarget{structpile_a404c7f7ab8c7abe008de4e28657983c8}\label{structpile_a404c7f7ab8c7abe008de4e28657983c8}
+int {\bfseries value}
+\begin{DoxyCompactList}\small\item\em value phantom documentation \end{DoxyCompactList}\item
+\Hypertarget{structpile_a34a9ae6f1ef6a39ba2c809da6dd4921d}\label{structpile_a34a9ae6f1ef6a39ba2c809da6dd4921d}
+struct \mbox{\hyperlink{structpile}{pile}} \texorpdfstring{$\ast$}{*} {\bfseries prev}
+\begin{DoxyCompactList}\small\item\em \texorpdfstring{$\ast$}{*}prev phantom documentation \end{DoxyCompactList}\end{DoxyCompactItemize}
+
+
+\doxysubsection{Detailed Description}
+phantom documentation used to test the functioning of doxygen
+
+The documentation for this struct was generated from the following file\+:\begin{DoxyCompactItemize}
+\item
+include/util.\+h\end{DoxyCompactItemize}
diff --git a/doc/latex/da/d0c/gl_8c.tex b/doc/latex/da/d0c/gl_8c.tex
new file mode 100644
index 0000000..8e7f87c
--- /dev/null
+++ b/doc/latex/da/d0c/gl_8c.tex
@@ -0,0 +1,196 @@
+\doxysection{src/util/draw/gl.c File Reference}
+\hypertarget{gl_8c}{}\label{gl_8c}\index{src/util/draw/gl.c@{src/util/draw/gl.c}}
+{\ttfamily \#include "{}../../../include/graphics.\+h"{}}\newline
+{\ttfamily \#include "{}../../../include/signal.\+h"{}}\newline
+\doxysubsubsection*{Classes}
+\begin{DoxyCompactItemize}
+\item
+struct \mbox{\hyperlink{structstack__index__t}{stack\+\_\+index\+\_\+t}}
+\begin{DoxyCompactList}\small\item\em phantom documentation used to test the functioning of doxygen \end{DoxyCompactList}\end{DoxyCompactItemize}
+\doxysubsubsection*{Macros}
+\begin{DoxyCompactItemize}
+\item
+\Hypertarget{gl_8c_a2737fdf992bd5a9d008f620ddaf50107}\label{gl_8c_a2737fdf992bd5a9d008f620ddaf50107}
+\#define {\bfseries GL\+\_\+\+AREA\+\_\+\+SIZE}~400
+\begin{DoxyCompactList}\small\item\em phantom documentation used to test the functioning of doxygen \end{DoxyCompactList}\end{DoxyCompactItemize}
+\doxysubsubsection*{Functions}
+\begin{DoxyCompactItemize}
+\item
+\Hypertarget{gl_8c_a289cfe9a70bcb690eeff2639dd8a98cd}\label{gl_8c_a289cfe9a70bcb690eeff2639dd8a98cd}
+int {\bfseries util\+\_\+gl\+\_\+set\+\_\+arrow} (int stack\+\_\+id, int arrows\+\_\+nb, int space\+\_\+X, int space\+\_\+Y, int space\+\_\+Z, int requested\+\_\+weight, int site, int arrow\+\_\+x, int arrow\+\_\+y, int arrow\+\_\+z)
+\begin{DoxyCompactList}\small\item\em phantom documentation used to test the functioning of doxygen \end{DoxyCompactList}\item
+long \mbox{\hyperlink{gl_8c_adbe03a3d239b22390e9de809443c8df9}{util\+\_\+gl\+\_\+get\+\_\+stack}} (void \texorpdfstring{$\ast$}{*}container\+\_\+widget)
+\begin{DoxyCompactList}\small\item\em Look for stack entry and returns stack\+\_\+id. \end{DoxyCompactList}\item
+long \mbox{\hyperlink{gl_8c_a5a691fdca6e3088ea9c1927096541624}{util\+\_\+gl\+\_\+is\+\_\+ready}} (void \texorpdfstring{$\ast$}{*}container\+\_\+widget)
+\begin{DoxyCompactList}\small\item\em Look for stack entry and returns stack\+\_\+id. \end{DoxyCompactList}\item
+bool \mbox{\hyperlink{gl_8c_a28b44187c7ae713705874288323e10a6}{util\+\_\+gl\+\_\+init\+\_\+stack}} (void \texorpdfstring{$\ast$}{*}container\+\_\+widget, GError \texorpdfstring{$\ast$}{*}error\+\_\+buffer)
+\begin{DoxyCompactList}\small\item\em Look for stack entry and initializes Open\+GL for it. \end{DoxyCompactList}\item
+bool \mbox{\hyperlink{gl_8c_a9d41985e1832e0a798e722d2341752f1}{util\+\_\+gl\+\_\+shutdown\+\_\+stack}} (void \texorpdfstring{$\ast$}{*}container\+\_\+widget, GError \texorpdfstring{$\ast$}{*}error\+\_\+buffer)
+\begin{DoxyCompactList}\small\item\em Look for stack entry and shutdowns Open\+GL for it. \end{DoxyCompactList}\item
+\Hypertarget{gl_8c_ab0a523986944f809fac9acc1693f3029}\label{gl_8c_ab0a523986944f809fac9acc1693f3029}
+void {\bfseries util\+\_\+gl\+\_\+clean\+\_\+stack\+\_\+index} (void)
+\begin{DoxyCompactList}\small\item\em phantom documentation used to test the functioning of doxygen \end{DoxyCompactList}\item
+bool \mbox{\hyperlink{gl_8c_a8132a1a797f4f12eaff04b4c3610f054}{util\+\_\+gl\+\_\+render\+\_\+stack}} (Gtk\+Widget \texorpdfstring{$\ast$}{*}container\+\_\+widget)
+\begin{DoxyCompactList}\small\item\em Look for stack entry and triggers Open\+GL for drawing. \end{DoxyCompactList}\item
+bool \mbox{\hyperlink{gl_8c_ad830e66002a24806e3617946dc988e95}{util\+\_\+gl\+\_\+update\+\_\+axis}} (Gtk\+Widget \texorpdfstring{$\ast$}{*}container\+\_\+widget, int axis, int value)
+\begin{DoxyCompactList}\small\item\em Look for stack entry and triggers Open\+GL for drawing. \end{DoxyCompactList}\item
+void \mbox{\hyperlink{gl_8c_ae2198c050662c486c8e66c6e6b5a7e0b}{util\+\_\+gl\+\_\+shutdown\+\_\+all\+\_\+stacks}} (void)
+\begin{DoxyCompactList}\small\item\em Look for every stack entry and shutdowns Open\+GL for it. \end{DoxyCompactList}\item
+Gtk\+Widget \texorpdfstring{$\ast$}{*} \mbox{\hyperlink{gl_8c_a2cb205bd6556250d019b4de59eee3894}{create\+\_\+axis\+\_\+slider}} (int axis)
+\begin{DoxyCompactList}\small\item\em Creates a slider widget. \end{DoxyCompactList}\item
+\Hypertarget{gl_8c_ac90dc30613c94fdefedb76cf6d2c4ac8}\label{gl_8c_ac90dc30613c94fdefedb76cf6d2c4ac8}
+bool {\bfseries util\+\_\+gl\+\_\+setup\+\_\+glarea} (int target\+\_\+mode, Gtk\+Widget \texorpdfstring{$\ast$}{*}target\+\_\+widget)
+\begin{DoxyCompactList}\small\item\em phantom documentation used to test the functioning of doxygen \end{DoxyCompactList}\end{DoxyCompactItemize}
+\doxysubsubsection*{Variables}
+\begin{DoxyCompactItemize}
+\item
+\Hypertarget{gl_8c_a176a1af12ef0fb33a5de5cd36ef7145a}\label{gl_8c_a176a1af12ef0fb33a5de5cd36ef7145a}
+size\+\_\+t {\bfseries stack\+\_\+index\+\_\+size} = 0
+\begin{DoxyCompactList}\small\item\em phantom documentation used to test the functioning of doxygen \end{DoxyCompactList}\end{DoxyCompactItemize}
+
+
+\doxysubsection{Function Documentation}
+\Hypertarget{gl_8c_a2cb205bd6556250d019b4de59eee3894}\label{gl_8c_a2cb205bd6556250d019b4de59eee3894}
+\index{gl.c@{gl.c}!create\_axis\_slider@{create\_axis\_slider}}
+\index{create\_axis\_slider@{create\_axis\_slider}!gl.c@{gl.c}}
+\doxysubsubsection{\texorpdfstring{create\_axis\_slider()}{create\_axis\_slider()}}
+{\footnotesize\ttfamily Gtk\+Widget \texorpdfstring{$\ast$}{*} create\+\_\+axis\+\_\+slider (\begin{DoxyParamCaption}\item[{int}]{axis }\end{DoxyParamCaption})}
+
+
+
+Creates a slider widget.
+
+
+\begin{DoxyParams}{Parameters}
+{\em axis} & the axis we\textquotesingle{}re building a label for\\
+\hline
+\end{DoxyParams}
+\begin{DoxyReturn}{Returns}
+Gtk\+Widget\texorpdfstring{$\ast$}{*}\+: pointer to the new widget
+\end{DoxyReturn}
+\Hypertarget{gl_8c_adbe03a3d239b22390e9de809443c8df9}\label{gl_8c_adbe03a3d239b22390e9de809443c8df9}
+\index{gl.c@{gl.c}!util\_gl\_get\_stack@{util\_gl\_get\_stack}}
+\index{util\_gl\_get\_stack@{util\_gl\_get\_stack}!gl.c@{gl.c}}
+\doxysubsubsection{\texorpdfstring{util\_gl\_get\_stack()}{util\_gl\_get\_stack()}}
+{\footnotesize\ttfamily long util\+\_\+gl\+\_\+get\+\_\+stack (\begin{DoxyParamCaption}\item[{void \texorpdfstring{$\ast$}{*}}]{container\+\_\+widget }\end{DoxyParamCaption})}
+
+
+
+Look for stack entry and returns stack\+\_\+id.
+
+
+\begin{DoxyParams}{Parameters}
+{\em container\+\_\+widget} & generally the Gtk\+Box that contains the GLArea\\
+\hline
+\end{DoxyParams}
+\begin{DoxyReturn}{Returns}
+stack\+\_\+id
+\end{DoxyReturn}
+\Hypertarget{gl_8c_a28b44187c7ae713705874288323e10a6}\label{gl_8c_a28b44187c7ae713705874288323e10a6}
+\index{gl.c@{gl.c}!util\_gl\_init\_stack@{util\_gl\_init\_stack}}
+\index{util\_gl\_init\_stack@{util\_gl\_init\_stack}!gl.c@{gl.c}}
+\doxysubsubsection{\texorpdfstring{util\_gl\_init\_stack()}{util\_gl\_init\_stack()}}
+{\footnotesize\ttfamily bool util\+\_\+gl\+\_\+init\+\_\+stack (\begin{DoxyParamCaption}\item[{void \texorpdfstring{$\ast$}{*}}]{container\+\_\+widget, }\item[{GError \texorpdfstring{$\ast$}{*}}]{error\+\_\+buffer }\end{DoxyParamCaption})}
+
+
+
+Look for stack entry and initializes Open\+GL for it.
+
+
+\begin{DoxyParams}{Parameters}
+{\em container\+\_\+widget} & generally the Gtk\+Box that contains the GLArea \\
+\hline
+{\em error\+\_\+buffer} & phantom documentation used to test the functioning of doxygen\\
+\hline
+\end{DoxyParams}
+\begin{DoxyReturn}{Returns}
+bool\+: true if success
+\end{DoxyReturn}
+\Hypertarget{gl_8c_a5a691fdca6e3088ea9c1927096541624}\label{gl_8c_a5a691fdca6e3088ea9c1927096541624}
+\index{gl.c@{gl.c}!util\_gl\_is\_ready@{util\_gl\_is\_ready}}
+\index{util\_gl\_is\_ready@{util\_gl\_is\_ready}!gl.c@{gl.c}}
+\doxysubsubsection{\texorpdfstring{util\_gl\_is\_ready()}{util\_gl\_is\_ready()}}
+{\footnotesize\ttfamily long util\+\_\+gl\+\_\+is\+\_\+ready (\begin{DoxyParamCaption}\item[{void \texorpdfstring{$\ast$}{*}}]{container\+\_\+widget }\end{DoxyParamCaption})}
+
+
+
+Look for stack entry and returns stack\+\_\+id.
+
+
+\begin{DoxyParams}{Parameters}
+{\em container\+\_\+widget} & generally the Gtk\+Box that contains the GLArea\\
+\hline
+\end{DoxyParams}
+\begin{DoxyReturn}{Returns}
+stack\+\_\+id
+\end{DoxyReturn}
+\Hypertarget{gl_8c_a8132a1a797f4f12eaff04b4c3610f054}\label{gl_8c_a8132a1a797f4f12eaff04b4c3610f054}
+\index{gl.c@{gl.c}!util\_gl\_render\_stack@{util\_gl\_render\_stack}}
+\index{util\_gl\_render\_stack@{util\_gl\_render\_stack}!gl.c@{gl.c}}
+\doxysubsubsection{\texorpdfstring{util\_gl\_render\_stack()}{util\_gl\_render\_stack()}}
+{\footnotesize\ttfamily bool util\+\_\+gl\+\_\+render\+\_\+stack (\begin{DoxyParamCaption}\item[{Gtk\+Widget \texorpdfstring{$\ast$}{*}}]{container\+\_\+widget }\end{DoxyParamCaption})}
+
+
+
+Look for stack entry and triggers Open\+GL for drawing.
+
+
+\begin{DoxyParams}{Parameters}
+{\em container\+\_\+widget} & generally the Gtk\+Box that contains the GLArea\\
+\hline
+\end{DoxyParams}
+\begin{DoxyReturn}{Returns}
+bool\+: true if success
+\end{DoxyReturn}
+\Hypertarget{gl_8c_ae2198c050662c486c8e66c6e6b5a7e0b}\label{gl_8c_ae2198c050662c486c8e66c6e6b5a7e0b}
+\index{gl.c@{gl.c}!util\_gl\_shutdown\_all\_stacks@{util\_gl\_shutdown\_all\_stacks}}
+\index{util\_gl\_shutdown\_all\_stacks@{util\_gl\_shutdown\_all\_stacks}!gl.c@{gl.c}}
+\doxysubsubsection{\texorpdfstring{util\_gl\_shutdown\_all\_stacks()}{util\_gl\_shutdown\_all\_stacks()}}
+{\footnotesize\ttfamily void util\+\_\+gl\+\_\+shutdown\+\_\+all\+\_\+stacks (\begin{DoxyParamCaption}\item[{void}]{ }\end{DoxyParamCaption})}
+
+
+
+Look for every stack entry and shutdowns Open\+GL for it.
+
+returns true if success ? TODO why not bool ? \Hypertarget{gl_8c_a9d41985e1832e0a798e722d2341752f1}\label{gl_8c_a9d41985e1832e0a798e722d2341752f1}
+\index{gl.c@{gl.c}!util\_gl\_shutdown\_stack@{util\_gl\_shutdown\_stack}}
+\index{util\_gl\_shutdown\_stack@{util\_gl\_shutdown\_stack}!gl.c@{gl.c}}
+\doxysubsubsection{\texorpdfstring{util\_gl\_shutdown\_stack()}{util\_gl\_shutdown\_stack()}}
+{\footnotesize\ttfamily bool util\+\_\+gl\+\_\+shutdown\+\_\+stack (\begin{DoxyParamCaption}\item[{void \texorpdfstring{$\ast$}{*}}]{container\+\_\+widget, }\item[{GError \texorpdfstring{$\ast$}{*}}]{error\+\_\+buffer }\end{DoxyParamCaption})}
+
+
+
+Look for stack entry and shutdowns Open\+GL for it.
+
+
+\begin{DoxyParams}{Parameters}
+{\em container\+\_\+widget} & generally the Gtk\+Box that contains the GLArea \\
+\hline
+{\em error\+\_\+buffer} & phantom documentation used to test the functioning of doxygen\\
+\hline
+\end{DoxyParams}
+\begin{DoxyReturn}{Returns}
+bool\+: true if success
+\end{DoxyReturn}
+\Hypertarget{gl_8c_ad830e66002a24806e3617946dc988e95}\label{gl_8c_ad830e66002a24806e3617946dc988e95}
+\index{gl.c@{gl.c}!util\_gl\_update\_axis@{util\_gl\_update\_axis}}
+\index{util\_gl\_update\_axis@{util\_gl\_update\_axis}!gl.c@{gl.c}}
+\doxysubsubsection{\texorpdfstring{util\_gl\_update\_axis()}{util\_gl\_update\_axis()}}
+{\footnotesize\ttfamily bool util\+\_\+gl\+\_\+update\+\_\+axis (\begin{DoxyParamCaption}\item[{Gtk\+Widget \texorpdfstring{$\ast$}{*}}]{container\+\_\+widget, }\item[{int}]{axis, }\item[{int}]{value }\end{DoxyParamCaption})}
+
+
+
+Look for stack entry and triggers Open\+GL for drawing.
+
+
+\begin{DoxyParams}{Parameters}
+{\em container\+\_\+widget} & generally the Gtk\+Box that contains the GLArea \\
+\hline
+{\em axis} & phantom documentation used to test the functioning of doxygen \\
+\hline
+{\em value} & phantom documentation used to test the functioning of doxygen\\
+\hline
+\end{DoxyParams}
+\begin{DoxyReturn}{Returns}
+bool\+: true if success
+\end{DoxyReturn}
diff --git a/doc/latex/dd/d0e/structgraphics__stack__t.tex b/doc/latex/dd/d0e/structgraphics__stack__t.tex
new file mode 100644
index 0000000..d617651
--- /dev/null
+++ b/doc/latex/dd/d0e/structgraphics__stack__t.tex
@@ -0,0 +1,101 @@
+\doxysection{graphics\+\_\+stack\+\_\+t Struct Reference}
+\hypertarget{structgraphics__stack__t}{}\label{structgraphics__stack__t}\index{graphics\_stack\_t@{graphics\_stack\_t}}
+
+
+Structure describing a gl\+\_\+area and its parameters, used to create a table of Gem-\/graph client current gl\+\_\+areas.
+
+
+
+
+{\ttfamily \#include $<$graphics.\+h$>$}
+
+\doxysubsubsection*{Public Attributes}
+\begin{DoxyCompactItemize}
+\item
+\Hypertarget{structgraphics__stack__t_af8578b691d14c1c0aefe7aab307d35d3}\label{structgraphics__stack__t_af8578b691d14c1c0aefe7aab307d35d3}
+int {\bfseries id}
+\begin{DoxyCompactList}\small\item\em phantom documentation \end{DoxyCompactList}\item
+\Hypertarget{structgraphics__stack__t_a6d15e9f6e455a5f6e07efd504092eabd}\label{structgraphics__stack__t_a6d15e9f6e455a5f6e07efd504092eabd}
+int {\bfseries mode}
+\begin{DoxyCompactList}\small\item\em phantom documentation \end{DoxyCompactList}\item
+\Hypertarget{structgraphics__stack__t_a24345e6e56468c81dbdc8c1b912d2da1}\label{structgraphics__stack__t_a24345e6e56468c81dbdc8c1b912d2da1}
+float {\bfseries rotation\+\_\+angles} \mbox{[}N\+\_\+\+AXIS\mbox{]}
+\begin{DoxyCompactList}\small\item\em Rotation angles on each axis. \end{DoxyCompactList}\item
+\Hypertarget{structgraphics__stack__t_af4b3f1ab3368005446f2e01152e4cbc2}\label{structgraphics__stack__t_af4b3f1ab3368005446f2e01152e4cbc2}
+GLuint {\bfseries vao}
+\begin{DoxyCompactList}\small\item\em init\+\_\+buffers ~\newline
+ \end{DoxyCompactList}\item
+\Hypertarget{structgraphics__stack__t_a8c4a73e3e7c47ebbe286ccd221b36345}\label{structgraphics__stack__t_a8c4a73e3e7c47ebbe286ccd221b36345}
+GLuint {\bfseries position\+\_\+buffer}
+\begin{DoxyCompactList}\small\item\em shutdown, draw ~\newline
+ \end{DoxyCompactList}\item
+\Hypertarget{structgraphics__stack__t_a91445f750de8bba35c7899a641517cde}\label{structgraphics__stack__t_a91445f750de8bba35c7899a641517cde}
+GLuint {\bfseries color\+\_\+buffer}
+\begin{DoxyCompactList}\small\item\em shutdown, draw ~\newline
+ \end{DoxyCompactList}\item
+\Hypertarget{structgraphics__stack__t_a45249c5bebc08c3e4633b510e60ef519}\label{structgraphics__stack__t_a45249c5bebc08c3e4633b510e60ef519}
+GLuint {\bfseries program}
+\begin{DoxyCompactList}\small\item\em shutdown, init\+\_\+shaders, draw ~\newline
+ \end{DoxyCompactList}\item
+\Hypertarget{structgraphics__stack__t_a450d45ed7b90d6755cc4d322b26886b5}\label{structgraphics__stack__t_a450d45ed7b90d6755cc4d322b26886b5}
+GLuint {\bfseries m}
+\begin{DoxyCompactList}\small\item\em init\+\_\+shaders, draw ~\newline
+ \end{DoxyCompactList}\item
+\Hypertarget{structgraphics__stack__t_a77cd82200c32fdb7a98b2d873bc47101}\label{structgraphics__stack__t_a77cd82200c32fdb7a98b2d873bc47101}
+GLuint {\bfseries v}
+\begin{DoxyCompactList}\small\item\em init\+\_\+shaders, draw ~\newline
+ \end{DoxyCompactList}\item
+\Hypertarget{structgraphics__stack__t_a2618a771cf69d50f41f73a9e73a954be}\label{structgraphics__stack__t_a2618a771cf69d50f41f73a9e73a954be}
+GLuint {\bfseries p}
+\begin{DoxyCompactList}\small\item\em init\+\_\+shaders, draw ~\newline
+ \end{DoxyCompactList}\item
+\Hypertarget{structgraphics__stack__t_a719da937a28bfc859981aa3d5fabfdad}\label{structgraphics__stack__t_a719da937a28bfc859981aa3d5fabfdad}
+struct \mbox{\hyperlink{structarrow__t}{arrow\+\_\+t}} \texorpdfstring{$\ast$}{*} {\bfseries arrows\+\_\+ptr}
+\begin{DoxyCompactList}\small\item\em phantom documentation \end{DoxyCompactList}\item
+\Hypertarget{structgraphics__stack__t_ac83224b08bcc3748aa67b801003a941d}\label{structgraphics__stack__t_ac83224b08bcc3748aa67b801003a941d}
+long {\bfseries arrows\+\_\+nb}
+\begin{DoxyCompactList}\small\item\em phantom documentation \end{DoxyCompactList}\item
+\Hypertarget{structgraphics__stack__t_a4fc7ff5da6655dc84f75e41aeea34114}\label{structgraphics__stack__t_a4fc7ff5da6655dc84f75e41aeea34114}
+GLfloat \texorpdfstring{$\ast$}{*} {\bfseries buffer\+\_\+vertex\+\_\+origin}
+\begin{DoxyCompactList}\small\item\em phantom documentation \end{DoxyCompactList}\item
+\Hypertarget{structgraphics__stack__t_abe0d5ff731ecb1c38580c9458d51da3c}\label{structgraphics__stack__t_abe0d5ff731ecb1c38580c9458d51da3c}
+GLfloat \texorpdfstring{$\ast$}{*} {\bfseries buffer\+\_\+colors\+\_\+origin}
+\begin{DoxyCompactList}\small\item\em phantom documentation \end{DoxyCompactList}\item
+\Hypertarget{structgraphics__stack__t_aa968f1b4399daec725f5add393f7c8ce}\label{structgraphics__stack__t_aa968f1b4399daec725f5add393f7c8ce}
+GLuint \texorpdfstring{$\ast$}{*} {\bfseries buffer\+\_\+lines\+\_\+origin}
+\begin{DoxyCompactList}\small\item\em phantom documentation \end{DoxyCompactList}\item
+\Hypertarget{structgraphics__stack__t_abb3a4f67b598704db32b6c04e264a3bf}\label{structgraphics__stack__t_abb3a4f67b598704db32b6c04e264a3bf}
+GLuint \texorpdfstring{$\ast$}{*} {\bfseries buffer\+\_\+plans\+\_\+origin}
+\begin{DoxyCompactList}\small\item\em phantom documentation \end{DoxyCompactList}\item
+\Hypertarget{structgraphics__stack__t_a2901c44699708610ff2854335f6e66d0}\label{structgraphics__stack__t_a2901c44699708610ff2854335f6e66d0}
+long {\bfseries buffer\+\_\+vertex\+\_\+size}
+\begin{DoxyCompactList}\small\item\em phantom documentation \end{DoxyCompactList}\item
+\Hypertarget{structgraphics__stack__t_a9fc79ebf7f482d032476f8a89eaf857f}\label{structgraphics__stack__t_a9fc79ebf7f482d032476f8a89eaf857f}
+long {\bfseries buffer\+\_\+colors\+\_\+size}
+\begin{DoxyCompactList}\small\item\em phantom documentation \end{DoxyCompactList}\item
+\Hypertarget{structgraphics__stack__t_ad8fab767b2f3e1f0455e99715ee7e091}\label{structgraphics__stack__t_ad8fab767b2f3e1f0455e99715ee7e091}
+long {\bfseries buffer\+\_\+lines\+\_\+size}
+\begin{DoxyCompactList}\small\item\em phantom documentation \end{DoxyCompactList}\item
+\Hypertarget{structgraphics__stack__t_a4c67dd123492ff9030a45708ee5d20df}\label{structgraphics__stack__t_a4c67dd123492ff9030a45708ee5d20df}
+long {\bfseries buffer\+\_\+plans\+\_\+size}
+\begin{DoxyCompactList}\small\item\em phantom documentation \end{DoxyCompactList}\item
+\Hypertarget{structgraphics__stack__t_af3f70fda4f00a22b6f31e9426fd74efc}\label{structgraphics__stack__t_af3f70fda4f00a22b6f31e9426fd74efc}
+long {\bfseries buffer\+\_\+vertex\+\_\+0\+\_\+arrow}
+\begin{DoxyCompactList}\small\item\em phantom documentation \end{DoxyCompactList}\item
+\Hypertarget{structgraphics__stack__t_a06c2ac4d28a8b125dd744d9970570f8e}\label{structgraphics__stack__t_a06c2ac4d28a8b125dd744d9970570f8e}
+long {\bfseries buffer\+\_\+colors\+\_\+0\+\_\+arrow}
+\begin{DoxyCompactList}\small\item\em phantom documentation \end{DoxyCompactList}\item
+\Hypertarget{structgraphics__stack__t_ad4d641051e231ba5c5f00b7eb427057e}\label{structgraphics__stack__t_ad4d641051e231ba5c5f00b7eb427057e}
+long {\bfseries buffer\+\_\+lines\+\_\+0\+\_\+arrow}
+\begin{DoxyCompactList}\small\item\em phantom documentation \end{DoxyCompactList}\item
+\Hypertarget{structgraphics__stack__t_a6d3507a54ebc6304f3e4bf24b7428c05}\label{structgraphics__stack__t_a6d3507a54ebc6304f3e4bf24b7428c05}
+long {\bfseries buffer\+\_\+plans\+\_\+0\+\_\+arrow}
+\begin{DoxyCompactList}\small\item\em phantom documentation \end{DoxyCompactList}\end{DoxyCompactItemize}
+
+
+\doxysubsection{Detailed Description}
+Structure describing a gl\+\_\+area and its parameters, used to create a table of Gem-\/graph client current gl\+\_\+areas.
+
+The documentation for this struct was generated from the following file\+:\begin{DoxyCompactItemize}
+\item
+include/graphics.\+h\end{DoxyCompactItemize}
diff --git a/doc/latex/df/d05/structslist.tex b/doc/latex/df/d05/structslist.tex
new file mode 100644
index 0000000..2f1ab9e
--- /dev/null
+++ b/doc/latex/df/d05/structslist.tex
@@ -0,0 +1,28 @@
+\doxysection{slist Struct Reference}
+\hypertarget{structslist}{}\label{structslist}\index{slist@{slist}}
+
+
+phantom documentation used to test the functioning of doxygen
+
+
+
+
+{\ttfamily \#include $<$util.\+h$>$}
+
+\doxysubsubsection*{Public Attributes}
+\begin{DoxyCompactItemize}
+\item
+\Hypertarget{structslist_a6c4e65b559a5537f7854b0d828204436}\label{structslist_a6c4e65b559a5537f7854b0d828204436}
+int {\bfseries value}
+\begin{DoxyCompactList}\small\item\em value phantom documentation \end{DoxyCompactList}\item
+\Hypertarget{structslist_a1dbb9625c8b52c7a6ae2d2e83b37fd43}\label{structslist_a1dbb9625c8b52c7a6ae2d2e83b37fd43}
+struct \mbox{\hyperlink{structslist}{slist}} \texorpdfstring{$\ast$}{*} {\bfseries suiv}
+\begin{DoxyCompactList}\small\item\em \texorpdfstring{$\ast$}{*}suiv phantom documentation \end{DoxyCompactList}\end{DoxyCompactItemize}
+
+
+\doxysubsection{Detailed Description}
+phantom documentation used to test the functioning of doxygen
+
+The documentation for this struct was generated from the following file\+:\begin{DoxyCompactItemize}
+\item
+include/util.\+h\end{DoxyCompactItemize}
diff --git a/doc/latex/doxygen.sty b/doc/latex/doxygen.sty
new file mode 100644
index 0000000..4bfc17f
--- /dev/null
+++ b/doc/latex/doxygen.sty
@@ -0,0 +1,694 @@
+\NeedsTeXFormat{LaTeX2e}
+\ProvidesPackage{doxygen}
+
+% Packages used by this style file
+\RequirePackage{alltt}
+%%\RequirePackage{array} %% moved to refman.tex due to workaround for LaTex 2019 version and unmaintained tabu package
+\RequirePackage{calc}
+\RequirePackage{float}
+%%\RequirePackage{ifthen} %% moved to refman.tex due to workaround for LaTex 2019 version and unmaintained tabu package
+\RequirePackage{verbatim}
+\RequirePackage[table]{xcolor}
+\RequirePackage{longtable_doxygen}
+\RequirePackage{tabu_doxygen}
+\RequirePackage{fancyvrb}
+\RequirePackage{tabularx}
+\RequirePackage{multicol}
+\RequirePackage{multirow}
+\RequirePackage{hanging}
+\RequirePackage{ifpdf}
+\RequirePackage{adjustbox}
+\RequirePackage{amssymb}
+\RequirePackage{stackengine}
+\RequirePackage{enumitem}
+\RequirePackage{alphalph}
+\RequirePackage[normalem]{ulem} % for strikeout, but don't modify emphasis
+
+%---------- Internal commands used in this style file ----------------
+
+\newcommand{\ensurespace}[1]{%
+ \begingroup%
+ \setlength{\dimen@}{#1}%
+ \vskip\z@\@plus\dimen@%
+ \penalty -100\vskip\z@\@plus -\dimen@%
+ \vskip\dimen@%
+ \penalty 9999%
+ \vskip -\dimen@%
+ \vskip\z@skip% hide the previous |\vskip| from |\addvspace|
+ \endgroup%
+}
+
+\newcommand{\DoxyHorRuler}[1]{%
+ \setlength{\parskip}{0ex plus 0ex minus 0ex}%
+ \ifthenelse{#1=0}%
+ {%
+ \hrule%
+ }%
+ {%
+ \hrulefilll%
+ }%
+}
+\newcommand{\DoxyLabelFont}{}
+\newcommand{\entrylabel}[1]{%
+ {%
+ \parbox[b]{\labelwidth-4pt}{%
+ \makebox[0pt][l]{\DoxyLabelFont#1}%
+ \vspace{1.5\baselineskip}%
+ }%
+ }%
+}
+
+\newenvironment{DoxyDesc}[1]{%
+ \ensurespace{4\baselineskip}%
+ \begin{list}{}{%
+ \settowidth{\labelwidth}{20pt}%
+ %\setlength{\parsep}{0pt}%
+ \setlength{\itemsep}{0pt}%
+ \setlength{\leftmargin}{\labelwidth+\labelsep}%
+ \renewcommand{\makelabel}{\entrylabel}%
+ }%
+ \item[#1]%
+}{%
+ \end{list}%
+}
+
+\newsavebox{\xrefbox}
+\newlength{\xreflength}
+\newcommand{\xreflabel}[1]{%
+ \sbox{\xrefbox}{#1}%
+ \setlength{\xreflength}{\wd\xrefbox}%
+ \ifthenelse{\xreflength>\labelwidth}{%
+ \begin{minipage}{\textwidth}%
+ \setlength{\parindent}{0pt}%
+ \hangindent=15pt\bfseries #1\vspace{1.2\itemsep}%
+ \end{minipage}%
+ }{%
+ \parbox[b]{\labelwidth}{\makebox[0pt][l]{\textbf{#1}}}%
+ }%
+}
+
+%---------- Commands used by doxygen LaTeX output generator ----------
+
+% Used by
...
+\newenvironment{DoxyPre}{%
+ \small%
+ \begin{alltt}%
+}{%
+ \end{alltt}%
+ \normalsize%
+}
+% Necessary for redefining not defined characters, i.e. "Replacement Character" in tex output.
+\newlength{\CodeWidthChar}
+\newlength{\CodeHeightChar}
+\settowidth{\CodeWidthChar}{?}
+\settoheight{\CodeHeightChar}{?}
+% Necessary for hanging indent
+\newlength{\DoxyCodeWidth}
+
+\newcommand\DoxyCodeLine[1]{
+ \ifthenelse{\equal{\detokenize{#1}}{}}
+ {
+ \vspace*{\baselineskip}
+ }
+ {
+ \hangpara{\DoxyCodeWidth}{1}{#1}\par
+ }
+}
+
+\newcommand\NiceSpace{%
+ \discretionary{}{\kern\fontdimen2\font}{\kern\fontdimen2\font}%
+}
+
+% Used by @code ... @endcode
+\newenvironment{DoxyCode}[1]{%
+ \par%
+ \scriptsize%
+ \normalfont\ttfamily%
+ \rightskip0pt plus 1fil%
+ \settowidth{\DoxyCodeWidth}{000000}%
+ \settowidth{\CodeWidthChar}{?}%
+ \settoheight{\CodeHeightChar}{?}%
+ \setlength{\parskip}{0ex plus 0ex minus 0ex}%
+ \ifthenelse{\equal{#1}{0}}
+ {
+ {\lccode`~32 \lowercase{\global\let~}\NiceSpace}\obeyspaces%
+ }
+ {
+ {\lccode`~32 \lowercase{\global\let~}}\obeyspaces%
+ }
+
+}{%
+ \normalfont%
+ \normalsize%
+ \settowidth{\CodeWidthChar}{?}%
+ \settoheight{\CodeHeightChar}{?}%
+}
+
+% Redefining not defined characters, i.e. "Replacement Character" in tex output.
+\def\ucr{\adjustbox{width=\CodeWidthChar,height=\CodeHeightChar}{\stackinset{c}{}{c}{-.2pt}{%
+ \textcolor{white}{\sffamily\bfseries\small ?}}{%
+ \rotatebox{45}{$\blacksquare$}}}}
+
+% Used by @example, @include, @includelineno and @dontinclude
+\newenvironment{DoxyCodeInclude}[1]{%
+ \DoxyCode{#1}%
+}{%
+ \endDoxyCode%
+}
+
+% Used by @verbatim ... @endverbatim
+\newenvironment{DoxyVerb}{%
+ \par%
+ \footnotesize%
+ \verbatim%
+}{%
+ \endverbatim%
+ \normalsize%
+}
+
+% Used by @verbinclude
+\newenvironment{DoxyVerbInclude}{%
+ \DoxyVerb%
+}{%
+ \endDoxyVerb%
+}
+
+% Used by numbered lists (using '-#' or ... )
+\setlistdepth{12}
+\newlist{DoxyEnumerate}{enumerate}{12}
+\setlist[DoxyEnumerate,1]{label=\arabic*.}
+\setlist[DoxyEnumerate,2]{label=(\enumalphalphcnt*)}
+\setlist[DoxyEnumerate,3]{label=\roman*.}
+\setlist[DoxyEnumerate,4]{label=\enumAlphAlphcnt*.}
+\setlist[DoxyEnumerate,5]{label=\arabic*.}
+\setlist[DoxyEnumerate,6]{label=(\enumalphalphcnt*)}
+\setlist[DoxyEnumerate,7]{label=\roman*.}
+\setlist[DoxyEnumerate,8]{label=\enumAlphAlphcnt*.}
+\setlist[DoxyEnumerate,9]{label=\arabic*.}
+\setlist[DoxyEnumerate,10]{label=(\enumalphalphcnt*)}
+\setlist[DoxyEnumerate,11]{label=\roman*.}
+\setlist[DoxyEnumerate,12]{label=\enumAlphAlphcnt*.}
+
+% Used by bullet lists (using '-', @li, @arg, or )
+\setlistdepth{12}
+\newlist{DoxyItemize}{itemize}{12}
+\setlist[DoxyItemize]{label=\textperiodcentered}
+
+\setlist[DoxyItemize,1]{label=\textbullet}
+\setlist[DoxyItemize,2]{label=\normalfont\bfseries \textendash}
+\setlist[DoxyItemize,3]{label=\textasteriskcentered}
+\setlist[DoxyItemize,4]{label=\textperiodcentered}
+
+% Used by description lists (using ... )
+\newenvironment{DoxyDescription}{%
+ \description%
+}{%
+ \enddescription%
+}
+
+% Used by @image, @dotfile, @dot ... @enddot, and @msc ... @endmsc
+% (only if caption is specified)
+\newenvironment{DoxyImage}{%
+ \begin{figure}[H]%
+ \centering%
+}{%
+ \end{figure}%
+}
+
+% Used by @image, @dotfile, @dot ... @enddot, and @msc ... @endmsc
+% (only if no caption is specified)
+\newenvironment{DoxyImageNoCaption}{%
+ \begin{center}%
+}{%
+ \end{center}%
+}
+
+% Used by @image
+% (only if inline is specified)
+\newenvironment{DoxyInlineImage}{%
+}{%
+}
+
+% Used by @attention
+\newenvironment{DoxyAttention}[1]{%
+ \begin{DoxyDesc}{#1}%
+}{%
+ \end{DoxyDesc}%
+}
+
+% Used by @author and @authors
+\newenvironment{DoxyAuthor}[1]{%
+ \begin{DoxyDesc}{#1}%
+}{%
+ \end{DoxyDesc}%
+}
+
+% Used by @date
+\newenvironment{DoxyDate}[1]{%
+ \begin{DoxyDesc}{#1}%
+}{%
+ \end{DoxyDesc}%
+}
+
+% Used by @invariant
+\newenvironment{DoxyInvariant}[1]{%
+ \begin{DoxyDesc}{#1}%
+}{%
+ \end{DoxyDesc}%
+}
+
+% Used by @note
+\newenvironment{DoxyNote}[1]{%
+ \begin{DoxyDesc}{#1}%
+}{%
+ \end{DoxyDesc}%
+}
+
+% Used by @post
+\newenvironment{DoxyPostcond}[1]{%
+ \begin{DoxyDesc}{#1}%
+}{%
+ \end{DoxyDesc}%
+}
+
+% Used by @pre
+\newenvironment{DoxyPrecond}[1]{%
+ \begin{DoxyDesc}{#1}%
+}{%
+ \end{DoxyDesc}%
+}
+
+% Used by @copyright
+\newenvironment{DoxyCopyright}[1]{%
+ \begin{DoxyDesc}{#1}%
+}{%
+ \end{DoxyDesc}%
+}
+
+% Used by @remark
+\newenvironment{DoxyRemark}[1]{%
+ \begin{DoxyDesc}{#1}%
+}{%
+ \end{DoxyDesc}%
+}
+
+% Used by @return and @returns
+\newenvironment{DoxyReturn}[1]{%
+ \begin{DoxyDesc}{#1}%
+}{%
+ \end{DoxyDesc}%
+}
+
+% Used by @since
+\newenvironment{DoxySince}[1]{%
+ \begin{DoxyDesc}{#1}%
+}{%
+ \end{DoxyDesc}%
+}
+
+% Used by @see
+\newenvironment{DoxySeeAlso}[1]{%
+ \begin{DoxyDesc}{#1}%
+}{%
+ \end{DoxyDesc}%
+}
+
+% Used by @version
+\newenvironment{DoxyVersion}[1]{%
+ \begin{DoxyDesc}{#1}%
+}{%
+ \end{DoxyDesc}%
+}
+
+% Used by @warning
+\newenvironment{DoxyWarning}[1]{%
+ \begin{DoxyDesc}{#1}%
+}{%
+ \end{DoxyDesc}%
+}
+
+% Used by @par and @paragraph
+\newenvironment{DoxyParagraph}[1]{%
+ \begin{DoxyDesc}{#1}%
+}{%
+ \end{DoxyDesc}%
+}
+
+% Used by parameter lists
+\newenvironment{DoxyParams}[2][]{%
+ \tabulinesep=1mm%
+ \par%
+ \ifthenelse{\equal{#1}{}}%
+ {\begin{longtabu*}spread 0pt [l]{|X[-1,l]|X[-1,l]|}}% name + description
+ {\ifthenelse{\equal{#1}{1}}%
+ {\begin{longtabu*}spread 0pt [l]{|X[-1,l]|X[-1,l]|X[-1,l]|}}% in/out + name + desc
+ {\begin{longtabu*}spread 0pt [l]{|X[-1,l]|X[-1,l]|X[-1,l]|X[-1,l]|}}% in/out + type + name + desc
+ }
+ \multicolumn{2}{l}{\hspace{-6pt}\bfseries\fontseries{bc}\selectfont\color{darkgray} #2}\\[1ex]%
+ \hline%
+ \endfirsthead%
+ \multicolumn{2}{l}{\hspace{-6pt}\bfseries\fontseries{bc}\selectfont\color{darkgray} #2}\\[1ex]%
+ \hline%
+ \endhead%
+}{%
+ \end{longtabu*}%
+ \vspace{6pt}%
+}
+
+% Used for fields of simple structs
+\newenvironment{DoxyFields}[1]{%
+ \tabulinesep=1mm%
+ \par%
+ \begin{longtabu*}spread 0pt [l]{|X[-1,r]|X[-1,l]|X[-1,l]|}%
+ \multicolumn{3}{l}{\hspace{-6pt}\bfseries\fontseries{bc}\selectfont\color{darkgray} #1}\\[1ex]%
+ \hline%
+ \endfirsthead%
+ \multicolumn{3}{l}{\hspace{-6pt}\bfseries\fontseries{bc}\selectfont\color{darkgray} #1}\\[1ex]%
+ \hline%
+ \endhead%
+}{%
+ \end{longtabu*}%
+ \vspace{6pt}%
+}
+
+% Used for fields simple class style enums
+\newenvironment{DoxyEnumFields}[1]{%
+ \tabulinesep=1mm%
+ \par%
+ \begin{longtabu*}spread 0pt [l]{|X[-1,r]|X[-1,l]|}%
+ \multicolumn{2}{l}{\hspace{-6pt}\bfseries\fontseries{bc}\selectfont\color{darkgray} #1}\\[1ex]%
+ \hline%
+ \endfirsthead%
+ \multicolumn{2}{l}{\hspace{-6pt}\bfseries\fontseries{bc}\selectfont\color{darkgray} #1}\\[1ex]%
+ \hline%
+ \endhead%
+}{%
+ \end{longtabu*}%
+ \vspace{6pt}%
+}
+
+% Used for parameters within a detailed function description
+\newenvironment{DoxyParamCaption}{%
+ \renewcommand{\item}[2][]{\\ \hspace*{2.0cm} ##1 {\em ##2}}%
+}{%
+}
+
+% Used by return value lists
+\newenvironment{DoxyRetVals}[1]{%
+ \tabulinesep=1mm%
+ \par%
+ \begin{longtabu*}spread 0pt [l]{|X[-1,r]|X[-1,l]|}%
+ \multicolumn{2}{l}{\hspace{-6pt}\bfseries\fontseries{bc}\selectfont\color{darkgray} #1}\\[1ex]%
+ \hline%
+ \endfirsthead%
+ \multicolumn{2}{l}{\hspace{-6pt}\bfseries\fontseries{bc}\selectfont\color{darkgray} #1}\\[1ex]%
+ \hline%
+ \endhead%
+}{%
+ \end{longtabu*}%
+ \vspace{6pt}%
+}
+
+% Used by exception lists
+\newenvironment{DoxyExceptions}[1]{%
+ \tabulinesep=1mm%
+ \par%
+ \begin{longtabu*}spread 0pt [l]{|X[-1,r]|X[-1,l]|}%
+ \multicolumn{2}{l}{\hspace{-6pt}\bfseries\fontseries{bc}\selectfont\color{darkgray} #1}\\[1ex]%
+ \hline%
+ \endfirsthead%
+ \multicolumn{2}{l}{\hspace{-6pt}\bfseries\fontseries{bc}\selectfont\color{darkgray} #1}\\[1ex]%
+ \hline%
+ \endhead%
+}{%
+ \end{longtabu*}%
+ \vspace{6pt}%
+}
+
+% Used by template parameter lists
+\newenvironment{DoxyTemplParams}[1]{%
+ \tabulinesep=1mm%
+ \par%
+ \begin{longtabu*}spread 0pt [l]{|X[-1,r]|X[-1,l]|}%
+ \multicolumn{2}{l}{\hspace{-6pt}\bfseries\fontseries{bc}\selectfont\color{darkgray} #1}\\[1ex]%
+ \hline%
+ \endfirsthead%
+ \multicolumn{2}{l}{\hspace{-6pt}\bfseries\fontseries{bc}\selectfont\color{darkgray} #1}\\[1ex]%
+ \hline%
+ \endhead%
+}{%
+ \end{longtabu*}%
+ \vspace{6pt}%
+}
+
+% Used for member lists
+\newenvironment{DoxyCompactItemize}{%
+ \begin{itemize}%
+ \setlength{\itemsep}{-3pt}%
+ \setlength{\parsep}{0pt}%
+ \setlength{\topsep}{0pt}%
+ \setlength{\partopsep}{0pt}%
+}{%
+ \end{itemize}%
+}
+
+% Used for member descriptions
+\newenvironment{DoxyCompactList}{%
+ \begin{list}{}{%
+ \setlength{\leftmargin}{0.5cm}%
+ \setlength{\itemsep}{0pt}%
+ \setlength{\parsep}{0pt}%
+ \setlength{\topsep}{0pt}%
+ \renewcommand{\makelabel}{\hfill}%
+ }%
+}{%
+ \end{list}%
+}
+
+% Used for reference lists (@bug, @deprecated, @todo, etc.)
+\newenvironment{DoxyRefList}{%
+ \begin{list}{}{%
+ \setlength{\labelwidth}{10pt}%
+ \setlength{\leftmargin}{\labelwidth}%
+ \addtolength{\leftmargin}{\labelsep}%
+ \renewcommand{\makelabel}{\xreflabel}%
+ }%
+}{%
+ \end{list}%
+}
+
+% Used by @bug, @deprecated, @todo, etc.
+\newenvironment{DoxyRefDesc}[1]{%
+ \begin{list}{}{%
+ \renewcommand\makelabel[1]{\textbf{##1}}%
+ \settowidth\labelwidth{\makelabel{#1}}%
+ \setlength\leftmargin{\labelwidth+\labelsep}%
+ }%
+}{%
+ \end{list}%
+}
+
+% Used by parameter lists and simple sections
+\newenvironment{Desc}
+{\begin{list}{}{%
+ \settowidth{\labelwidth}{20pt}%
+ \setlength{\parsep}{0pt}%
+ \setlength{\itemsep}{0pt}%
+ \setlength{\leftmargin}{\labelwidth+\labelsep}%
+ \renewcommand{\makelabel}{\entrylabel}%
+ }
+}{%
+ \end{list}%
+}
+
+% Used by tables
+\newcommand{\PBS}[1]{\let\temp=\\#1\let\\=\temp}%
+\newenvironment{TabularC}[1]%
+{\tabulinesep=1mm
+\begin{longtabu*}spread 0pt [c]{*#1{|X[-1]}|}}%
+{\end{longtabu*}\par}%
+
+\newenvironment{TabularNC}[1]%
+{\begin{tabu}spread 0pt [l]{*#1{|X[-1]}|}}%
+{\end{tabu}\par}%
+
+% Used for member group headers
+\newenvironment{Indent}{%
+ \begin{list}{}{%
+ \setlength{\leftmargin}{0.5cm}%
+ }%
+ \item[]\ignorespaces%
+}{%
+ \unskip%
+ \end{list}%
+}
+
+% Used when hyperlinks are turned on
+\newcommand{\doxylink}[2]{%
+ \mbox{\hyperlink{#1}{#2}}%
+}
+
+% Used when hyperlinks are turned on
+% Third argument is the SectionType, see the doxygen internal
+% documentation for the values (relevant: Page ... Subsubsection).
+\newcommand{\doxysectlink}[3]{%
+ \mbox{\hyperlink{#1}{#2}}%
+}
+% Used when hyperlinks are turned off
+\newcommand{\doxyref}[3]{%
+ \textbf{#1} (\textnormal{#2}\,\pageref{#3})%
+}
+
+% Used when hyperlinks are turned off
+% Fourth argument is the SectionType, see the doxygen internal
+% documentation for the values (relevant: Page ... Subsubsection).
+\newcommand{\doxysectref}[4]{%
+ \textbf{#1} (\textnormal{#2}\,\pageref{#3})%
+}
+
+% Used to link to a table when hyperlinks are turned on
+\newcommand{\doxytablelink}[2]{%
+ \ref{#1}%
+}
+
+% Used to link to a table when hyperlinks are turned off
+\newcommand{\doxytableref}[3]{%
+ \ref{#3}%
+}
+
+% Used by @addindex
+\newcommand{\lcurly}{\{}
+\newcommand{\rcurly}{\}}
+
+% Colors used for syntax highlighting
+\definecolor{comment}{rgb}{0.5,0.0,0.0}
+\definecolor{keyword}{rgb}{0.0,0.5,0.0}
+\definecolor{keywordtype}{rgb}{0.38,0.25,0.125}
+\definecolor{keywordflow}{rgb}{0.88,0.5,0.0}
+\definecolor{preprocessor}{rgb}{0.5,0.38,0.125}
+\definecolor{stringliteral}{rgb}{0.0,0.125,0.25}
+\definecolor{charliteral}{rgb}{0.0,0.5,0.5}
+\definecolor{xmlcdata}{rgb}{0.0,0.0,0.0}
+\definecolor{vhdldigit}{rgb}{1.0,0.0,1.0}
+\definecolor{vhdlkeyword}{rgb}{0.43,0.0,0.43}
+\definecolor{vhdllogic}{rgb}{1.0,0.0,0.0}
+\definecolor{vhdlchar}{rgb}{0.0,0.0,0.0}
+
+% Color used for table heading
+\newcommand{\tableheadbgcolor}{lightgray}%
+
+% Version of hypertarget with correct landing location
+\newcommand{\Hypertarget}[1]{\Hy@raisedlink{\hypertarget{#1}{}}}
+
+% possibility to have sections etc. be within the margins
+% unfortunately had to copy part of book.cls and add \raggedright
+\makeatletter
+\newcounter{subsubsubsection}[subsubsection]
+\newcounter{subsubsubsubsection}[subsubsubsection]
+\newcounter{subsubsubsubsubsection}[subsubsubsubsection]
+\newcounter{subsubsubsubsubsubsection}[subsubsubsubsubsection]
+\renewcommand{\thesubsubsubsection}{\thesubsubsection.\arabic{subsubsubsection}}
+\renewcommand{\thesubsubsubsubsection}{\thesubsubsubsection.\arabic{subsubsubsubsection}}
+\renewcommand{\thesubsubsubsubsubsection}{\thesubsubsubsubsection.\arabic{subsubsubsubsubsection}}
+\renewcommand{\thesubsubsubsubsubsubsection}{\thesubsubsubsubsubsection.\arabic{subsubsubsubsubsubsection}}
+\newcommand{\subsubsubsectionmark}[1]{}
+\newcommand{\subsubsubsubsectionmark}[1]{}
+\newcommand{\subsubsubsubsubsectionmark}[1]{}
+\newcommand{\subsubsubsubsubsubsectionmark}[1]{}
+\def\toclevel@subsubsubsection{4}
+\def\toclevel@subsubsubsubsection{5}
+\def\toclevel@subsubsubsubsubsection{6}
+\def\toclevel@subsubsubsubsubsubsection{7}
+\def\toclevel@paragraph{8}
+\def\toclevel@subparagraph{9}
+
+\newcommand\doxysection{\@startsection {section}{1}{\z@}%
+ {-3.5ex \@plus -1ex \@minus -.2ex}%
+ {2.3ex \@plus.2ex}%
+ {\raggedright\normalfont\Large\bfseries}}
+\newcommand\doxysubsection{\@startsection{subsection}{2}{\z@}%
+ {-3.25ex\@plus -1ex \@minus -.2ex}%
+ {1.5ex \@plus .2ex}%
+ {\raggedright\normalfont\large\bfseries}}
+\newcommand\doxysubsubsection{\@startsection{subsubsection}{3}{\z@}%
+ {-3.25ex\@plus -1ex \@minus -.2ex}%
+ {1.5ex \@plus .2ex}%
+ {\raggedright\normalfont\normalsize\bfseries}}
+\newcommand\doxysubsubsubsection{\@startsection{subsubsubsection}{4}{\z@}%
+ {-3.25ex\@plus -1ex \@minus -.2ex}%
+ {1.5ex \@plus .2ex}%
+ {\raggedright\normalfont\normalsize\bfseries}}
+\newcommand\doxysubsubsubsubsection{\@startsection{subsubsubsubsection}{5}{\z@}%
+ {-3.25ex\@plus -1ex \@minus -.2ex}%
+ {1.5ex \@plus .2ex}%
+ {\raggedright\normalfont\normalsize\bfseries}}
+\newcommand\doxysubsubsubsubsubsection{\@startsection{subsubsubsubsubsection}{6}{\z@}%
+ {-3.25ex\@plus -1ex \@minus -.2ex}%
+ {1.5ex \@plus .2ex}%
+ {\raggedright\normalfont\normalsize\bfseries}}
+\newcommand\doxysubsubsubsubsubsubsection{\@startsection{subsubsubsubsubsubsection}{7}{\z@}%
+ {-3.25ex\@plus -1ex \@minus -.2ex}%
+ {1.5ex \@plus .2ex}%
+ {\raggedright\normalfont\normalsize\bfseries}}
+\newcommand\doxyparagraph{\@startsection{paragraph}{8}{\z@}%
+ {-3.25ex\@plus -1ex \@minus -.2ex}%
+ {1.5ex \@plus .2ex}%
+ {\raggedright\normalfont\normalsize\bfseries}}
+\newcommand\doxysubparagraph{\@startsection{subparagraph}{9}{\parindent}%
+ {-3.25ex\@plus -1ex \@minus -.2ex}%
+ {1.5ex \@plus .2ex}%
+ {\raggedright\normalfont\normalsize\bfseries}}
+
+\newcommand\l@subsubsubsection{\@dottedtocline{4}{6.1em}{7.8em}}
+\newcommand\l@subsubsubsubsection{\@dottedtocline{5}{6.1em}{9.4em}}
+\newcommand\l@subsubsubsubsubsection{\@dottedtocline{6}{6.1em}{11em}}
+\newcommand\l@subsubsubsubsubsubsection{\@dottedtocline{7}{6.1em}{12.6em}}
+\renewcommand\l@paragraph{\@dottedtocline{8}{6.1em}{14.2em}}
+\renewcommand\l@subparagraph{\@dottedtocline{9}{6.1em}{15.8em}}
+\makeatother
+% the sectsty doesn't look to be maintained but gives, in our case, some warning like:
+% LaTeX Warning: Command \underline has changed.
+% Check if current package is valid.
+% unfortunately had to copy the relevant part
+\newcommand*{\doxypartfont} [1]
+ {\gdef\SS@partnumberfont{\SS@sectid{0}\SS@nopart\SS@makeulinepartchap#1}
+ \gdef\SS@parttitlefont{\SS@sectid{0}\SS@titlepart\SS@makeulinepartchap#1}}
+\newcommand*{\doxychapterfont} [1]
+ {\gdef\SS@chapnumfont{\SS@sectid{1}\SS@nopart\SS@makeulinepartchap#1}
+ \gdef\SS@chaptitlefont{\SS@sectid{1}\SS@titlepart\SS@makeulinepartchap#1}}
+\newcommand*{\doxysectionfont} [1]
+ {\gdef\SS@sectfont{\SS@sectid{2}\SS@rr\SS@makeulinesect#1}}
+\newcommand*{\doxysubsectionfont} [1]
+ {\gdef\SS@subsectfont{\SS@sectid{3}\SS@rr\SS@makeulinesect#1}}
+\newcommand*{\doxysubsubsectionfont} [1]
+ {\gdef\SS@subsubsectfont{\SS@sectid{4}\SS@rr\SS@makeulinesect#1}}
+\newcommand*{\doxyparagraphfont} [1]
+ {\gdef\SS@parafont{\SS@sectid{5}\SS@rr\SS@makeulinesect#1}}
+\newcommand*{\doxysubparagraphfont} [1]
+ {\gdef\SS@subparafont{\SS@sectid{6}\SS@rr\SS@makeulinesect#1}}
+\newcommand*{\doxyminisecfont} [1]
+ {\gdef\SS@minisecfont{\SS@sectid{7}\SS@rr\SS@makeulinepartchap#1}}
+\newcommand*{\doxyallsectionsfont} [1] {\doxypartfont{#1}%
+ \doxychapterfont{#1}%
+ \doxysectionfont{#1}%
+ \doxysubsectionfont{#1}%
+ \doxysubsubsectionfont{#1}%
+ \doxyparagraphfont{#1}%
+ \doxysubparagraphfont{#1}%
+ \doxyminisecfont{#1}}%
+% Define caption that is also suitable in a table
+\makeatletter
+\def\doxyfigcaption{%
+\H@refstepcounter{figure}%
+\@dblarg{\@caption{figure}}}
+\makeatother
+
+% Define alpha enumarative names for counters > 26
+\makeatletter
+\def\enumalphalphcnt#1{\expandafter\@enumalphalphcnt\csname c@#1\endcsname}
+\def\@enumalphalphcnt#1{\alphalph{#1}}
+\def\enumAlphAlphcnt#1{\expandafter\@enumAlphAlphcnt\csname c@#1\endcsname}
+\def\@enumAlphAlphcnt#1{\AlphAlph{#1}}
+\makeatother
+\AddEnumerateCounter{\enumalphalphcnt}{\@enumalphalphcnt}{aa}
+\AddEnumerateCounter{\enumAlphAlphcnt}{\@enumAlphAlphcnt}{AA}
diff --git a/doc/latex/etoc_doxygen.sty b/doc/latex/etoc_doxygen.sty
new file mode 100644
index 0000000..5f7e127
--- /dev/null
+++ b/doc/latex/etoc_doxygen.sty
@@ -0,0 +1,2178 @@
+%%
+%% This is file etoc_doxygen.sty
+%%
+%% Apart from this header notice and the renaming from etoc to
+%% etoc_doxygen (also in \ProvidesPackage) it is an identical
+%% copy of
+%%
+%% etoc.sty
+%%
+%% at version 1.2b of 2023/07/01.
+%%
+%% This file has been provided to Doxygen team courtesy of the
+%% author for benefit of users having a LaTeX installation not
+%% yet providing version 1.2a or later of etoc, whose
+%% deeplevels feature is required.
+%%
+%% The original source etoc.dtx (only of the latest version at
+%% any given time) is available at
+%%
+%% https://ctan.org/pkg/etoc
+%%
+%% and contains the terms for copying and modification as well
+%% as author contact information.
+%%
+%% In brief any modified versions of this file must be renamed
+%% with new filenames distinct from etoc.sty.
+%%
+%% Package: etoc
+%% Version: 1.2b
+%% License: LPPL 1.3c
+%% Copyright (C) 2012-2023 Jean-Francois B.
+\NeedsTeXFormat{LaTeX2e}[2003/12/01]
+\ProvidesPackage{etoc_doxygen}[2023/07/01 v1.2b Completely customisable TOCs (JFB)]
+\newif\ifEtoc@oldLaTeX
+\@ifl@t@r\fmtversion{2020/10/01}
+ {}
+ {\Etoc@oldLaTeXtrue
+ \PackageInfo{etoc}{Old LaTeX (\fmtversion) detected!\MessageBreak
+ Since 1.1a (2023/01/14), etoc prefers LaTeX at least\MessageBreak
+ as recent as 2020-10-01, for reasons of the .toc file,\MessageBreak
+ and used to require it (from 1.1a to 1.2).\MessageBreak
+ This etoc (1.2b) does not *require* it, but has not been\MessageBreak
+ tested thoroughly on old LaTeX (especially if document\MessageBreak
+ does not use hyperref) and retrofitting was done only\MessageBreak
+ on basis of author partial remembrances of old context.\MessageBreak
+ Reported}}
+\RequirePackage{kvoptions}
+\SetupKeyvalOptions{prefix=Etoc@}
+\newif\ifEtoc@lof
+\DeclareVoidOption{lof}{\Etoc@loftrue
+ \PackageInfo{etoc}{Experimental support for \string\locallistoffigures.\MessageBreak
+ Barely tested, use at own risk}%
+}
+\newif\ifEtoc@lot
+\DeclareVoidOption{lot}{\Etoc@lottrue
+ \PackageInfo{etoc}{Experimental support for \string\locallistoftables.\MessageBreak
+ Barely tested, use at own risk}%
+}
+\@ifclassloaded{memoir}{
+\PackageInfo{etoc}
+ {As this is with memoir class, all `...totoc' options\MessageBreak
+ are set true by default. Reported}
+\DeclareBoolOption[true]{maintoctotoc}
+\DeclareBoolOption[true]{localtoctotoc}
+\DeclareBoolOption[true]{localloftotoc}
+\DeclareBoolOption[true]{locallottotoc}
+}{
+\DeclareBoolOption[false]{maintoctotoc}
+\DeclareBoolOption[false]{localtoctotoc}
+\DeclareBoolOption[false]{localloftotoc}
+\DeclareBoolOption[false]{locallottotoc}
+}
+\DeclareBoolOption[true]{ouroboros}
+\DeclareBoolOption[false]{deeplevels}
+\DeclareDefaultOption{\PackageWarning{etoc}{Option `\CurrentOption' is unknown.}}
+\ProcessKeyvalOptions*
+\DisableKeyvalOption[action=error,package=etoc]{etoc}{lof}
+\DisableKeyvalOption[action=error,package=etoc]{etoc}{lot}
+\DisableKeyvalOption[action=error,package=etoc]{etoc}{deeplevels}
+\def\etocsetup#1{\setkeys{etoc}{#1}}
+\def\etocifmaintoctotoc{\ifEtoc@maintoctotoc
+ \expandafter\@firstoftwo
+ \else
+ \expandafter\@secondoftwo
+ \fi}
+\def\etociflocaltoctotoc{\ifEtoc@localtoctotoc
+ \expandafter\@firstoftwo
+ \else
+ \expandafter\@secondoftwo
+ \fi}
+\def\etociflocalloftotoc{\ifEtoc@localloftotoc
+ \expandafter\@firstoftwo
+ \else
+ \expandafter\@secondoftwo
+ \fi}
+\def\etociflocallottotoc{\ifEtoc@locallottotoc
+ \expandafter\@firstoftwo
+ \else
+ \expandafter\@secondoftwo
+ \fi}
+\RequirePackage{multicol}
+\def\etoc@{\etoc@}
+\long\def\Etoc@gobtoetoc@ #1\etoc@{}
+\newtoks\Etoc@toctoks
+\def\Etoc@par{\par}
+\def\etocinline{\def\Etoc@par{}}
+\let\etocnopar\etocinline
+\def\etocdisplay{\def\Etoc@par{\par}}
+\let\Etoc@global\@empty
+\def\etocglobaldefs{\let\Etoc@global\global\let\tof@global\global}
+\def\etoclocaldefs {\let\Etoc@global\@empty\let\tof@global\@empty}
+\newif\ifEtoc@numbered
+\newif\ifEtoc@hyperref
+\newif\ifEtoc@parskip
+\newif\ifEtoc@tocwithid
+\newif\ifEtoc@standardlines
+\newif\ifEtoc@etocstyle
+\newif\ifEtoc@classstyle
+\newif\ifEtoc@keeporiginaltoc
+\newif\ifEtoc@skipprefix
+\newif\ifEtoc@isfirst
+\newif\ifEtoc@localtoc
+\newif\ifEtoc@skipthisone
+\newif\ifEtoc@stoptoc
+\newif\ifEtoc@notactive
+\newif\ifEtoc@mustclosegroup
+\newif\ifEtoc@isemptytoc
+\newif\ifEtoc@checksemptiness
+\def\etocchecksemptiness {\Etoc@checksemptinesstrue }
+\def\etocdoesnotcheckemptiness {\Etoc@checksemptinessfalse }
+\newif\ifEtoc@notocifnotoc
+\def\etocnotocifnotoc {\Etoc@checksemptinesstrue\Etoc@notocifnotoctrue }
+\newcounter{etoc@tocid}
+\def\Etoc@tocext{toc}
+\def\Etoc@lofext{lof}
+\def\Etoc@lotext{lot}
+\let\Etoc@currext\Etoc@tocext
+\def\etocifislocal{\ifEtoc@localtoc\expandafter\@firstoftwo\else
+ \expandafter\@secondoftwo\fi
+ }
+\def\etocifislocaltoc{\etocifislocal{\ifx\Etoc@currext\Etoc@tocext
+ \expandafter\@firstoftwo\else
+ \expandafter\@secondoftwo\fi}%
+ {\@secondoftwo}%
+ }
+\def\etocifislocallof{\etocifislocal{\ifx\Etoc@currext\Etoc@lofext
+ \expandafter\@firstoftwo\else
+ \expandafter\@secondoftwo\fi}%
+ {\@secondoftwo}%
+ }
+\def\etocifislocallot{\etocifislocal{\ifx\Etoc@currext\Etoc@lotext
+ \expandafter\@firstoftwo\else
+ \expandafter\@secondoftwo\fi}%
+ {\@secondoftwo}%
+ }
+\expandafter\def\csname Etoc@-3@@\endcsname {-\thr@@}
+\expandafter\def\csname Etoc@-2@@\endcsname {-\tw@}
+\expandafter\let\csname Etoc@-1@@\endcsname \m@ne
+\expandafter\let\csname Etoc@0@@\endcsname \z@
+\expandafter\let\csname Etoc@1@@\endcsname \@ne
+\expandafter\let\csname Etoc@2@@\endcsname \tw@
+\expandafter\let\csname Etoc@3@@\endcsname \thr@@
+\expandafter\chardef\csname Etoc@4@@\endcsname 4
+\expandafter\chardef\csname Etoc@5@@\endcsname 5
+\expandafter\chardef\csname Etoc@6@@\endcsname 6
+\ifEtoc@deeplevels
+ \expandafter\chardef\csname Etoc@7@@\endcsname 7
+ \expandafter\chardef\csname Etoc@8@@\endcsname 8
+ \expandafter\chardef\csname Etoc@9@@\endcsname 9
+ \expandafter\chardef\csname Etoc@10@@\endcsname 10
+ \expandafter\chardef\csname Etoc@11@@\endcsname 11
+ \expandafter\chardef\csname Etoc@12@@\endcsname 12
+\fi
+\expandafter\let\expandafter\Etoc@maxlevel
+ \csname Etoc@\ifEtoc@deeplevels12\else6\fi @@\endcsname
+\edef\etocthemaxlevel{\number\Etoc@maxlevel}
+\@ifclassloaded{memoir}{\def\Etoc@minf{-\thr@@}}{\def\Etoc@minf{-\tw@}}
+\let\Etoc@none@@ \Etoc@minf
+\expandafter\let\expandafter\Etoc@all@@
+ \csname Etoc@\ifEtoc@deeplevels11\else5\fi @@\endcsname
+\let\Etoc@dolevels\@empty
+\def\Etoc@newlevel #1{\expandafter\def\expandafter\Etoc@dolevels\expandafter
+ {\Etoc@dolevels\Etoc@do{#1}}}
+\ifdefined\expanded
+ \def\etocsetlevel#1#2{\expanded{\noexpand\etoc@setlevel{#1}{#2}}}%
+\else
+ \def\etocsetlevel#1#2{{\edef\Etoc@tmp{\noexpand\etoc@setlevel{#1}{#2}}\expandafter}\Etoc@tmp}%
+\fi
+\def\etoc@setlevel#1#2{%
+ \edef\Etoc@tmp{\the\numexpr#2}%
+ \if1\ifnum\Etoc@tmp>\Etoc@maxlevel0\fi\unless\ifnum\Etoc@minf<\Etoc@tmp;\fi1%
+ \ifEtoc@deeplevels
+ \in@{.#1,}{.none,.all,.figure,.table,.-3,.-2,.-1,.0,.1,.2,.3,.4,.5,.6,%
+ .7,.8,.9,.10,.11,.12,}%
+ \else
+ \in@{.#1,}{.none,.all,.figure,.table,.-3,.-2,.-1,.0,.1,.2,.3,.4,.5,.6,}%
+ \fi
+ \ifin@\else\if\@car#1\@nil @\in@true\fi\fi
+ \ifin@
+ \PackageWarning{etoc}
+ {Sorry, but `#1' is forbidden as level name.\MessageBreak
+ \if\@car#1\@nil @%
+ (because of the @ as first character)\MessageBreak\fi
+ Reported}%
+ \else
+ \etocifunknownlevelTF{#1}{\Etoc@newlevel{#1}}{}%
+ \expandafter\let\csname Etoc@#1@@\expandafter\endcsname
+ \csname Etoc@\Etoc@tmp @@\endcsname
+ \expandafter\edef\csname Etoc@@#1@@\endcsname
+ {\expandafter\noexpand\csname Etoc@#1@@\endcsname}%
+ \expandafter\edef\csname toclevel@@#1\endcsname
+ {\expandafter\noexpand\csname toclevel@#1\endcsname}%
+ \fi
+ \else
+ \PackageWarning{etoc}
+ {Argument `\detokenize{#2}' of \string\etocsetlevel\space should
+ represent one of\MessageBreak
+ \ifnum\Etoc@minf=-\thr@@-2, \fi-1, 0, 1, 2, \ifEtoc@deeplevels ...\else3, 4\fi,
+ \the\numexpr\Etoc@maxlevel-1, or \number\Etoc@maxlevel\space
+ but evaluates to \Etoc@tmp.\MessageBreak
+ The level of `#1' will be set to \number\Etoc@maxlevel.\MessageBreak
+ Tables of contents will ignore `#1' as long\MessageBreak
+ as its level is \number\Etoc@maxlevel\space (=\string\etocthemaxlevel).%
+ \MessageBreak
+ Reported}%
+ \etocifunknownlevelTF{#1}{\Etoc@newlevel{#1}}{}%
+ \expandafter\let\csname Etoc@#1@@\endcsname\Etoc@maxlevel
+ \fi
+}
+\def\etoclevel#1{\csname Etoc@#1@@\endcsname}
+\def\etocthelevel#1{\number\csname Etoc@#1@@\endcsname}
+\def\etocifunknownlevelTF#1{\@ifundefined{Etoc@#1@@}}
+\@ifclassloaded{memoir}{\etocsetlevel{book}{-2}}{}
+\etocsetlevel{part}{-1}
+\etocsetlevel{chapter}{0}
+\etocsetlevel{section}{1}
+\etocsetlevel{subsection}{2}
+\etocsetlevel{subsubsection}{3}
+\etocsetlevel{paragraph}{4}
+\etocsetlevel{subparagraph}{5}
+\ifdefined\c@chapter
+ \etocsetlevel{appendix}{0}
+\else
+ \etocsetlevel{appendix}{1}
+\fi
+\def\Etoc@do#1{\@namedef{l@@#1}{\csname l@#1\endcsname}}
+\Etoc@dolevels
+\let\Etoc@figure@@\Etoc@maxlevel
+\let\Etoc@table@@ \Etoc@maxlevel
+\let\Etoc@gobblethreeorfour\@gobblefour
+\ifdefined\@gobblethree
+ \let\Etoc@gobblethree\@gobblethree
+\else
+ \long\def\Etoc@gobblethree#1#2#3{}%
+\fi
+\AtBeginDocument{%
+\@ifpackageloaded{parskip}{\Etoc@parskiptrue}{}%
+\@ifpackageloaded{hyperref}
+ {\Etoc@hyperreftrue}
+ {\ifEtoc@oldLaTeX
+ \let\Etoc@gobblethreeorfour\Etoc@gobblethree
+ \let\Etoc@etoccontentsline@fourargs\Etoc@etoccontentsline@
+ \long\def\Etoc@etoccontentsline@#1#2#3{%
+ \Etoc@etoccontentsline@fourargs{#1}{#2}{#3}{}%
+ }%
+ \fi
+ }%
+}
+\def\etocskipfirstprefix {\global\Etoc@skipprefixtrue }
+\def\Etoc@updatestackofends#1\etoc@{\gdef\Etoc@stackofends{#1}}
+\def\Etoc@stackofends{{-3}{}}
+\def\Etoc@doendsandbegin{%
+ \expandafter\Etoc@traversestackofends\Etoc@stackofends\etoc@
+}
+\def\Etoc@traversestackofends#1{%
+ \ifnum#1>\Etoc@level
+ \csname Etoc@end@#1\endcsname
+ \expandafter\Etoc@traversestackofends
+ \else
+ \Etoc@traversestackofends@done{#1}%
+ \fi
+}
+\def\Etoc@traversestackofends@done#1#2{#2%
+ \ifnum#1<\Etoc@level
+ \csname Etoc@begin@\the\numexpr\Etoc@level\endcsname
+ \Etoc@global\Etoc@isfirsttrue
+ \edef\Etoc@tmp{{\the\numexpr\Etoc@level}}%
+ \else
+ \Etoc@global\Etoc@isfirstfalse
+ \let\Etoc@tmp\@empty
+ \fi
+ \expandafter\Etoc@updatestackofends\Etoc@tmp{#1}%
+}
+\def\Etoc@etoccontentsline #1{%
+ \let\Etoc@next\Etoc@gobblethreeorfour
+ \ifnum\csname Etoc@#1@@\endcsname=\Etoc@maxlevel
+ \else
+ \Etoc@skipthisonefalse
+ \global\expandafter\let\expandafter\Etoc@level\csname Etoc@#1@@\endcsname
+ \if @\@car#1\@nil\else\global\let\Etoc@virtualtop\Etoc@level\fi
+ \ifEtoc@localtoc
+ \ifEtoc@stoptoc
+ \Etoc@skipthisonetrue
+ \else
+ \ifEtoc@notactive
+ \Etoc@skipthisonetrue
+ \else
+ \unless\ifnum\Etoc@level>\etoclocaltop
+ \Etoc@skipthisonetrue
+ \global\Etoc@stoptoctrue
+ \fi
+ \fi
+ \fi
+ \fi
+ \ifEtoc@skipthisone
+ \else
+ \unless\ifnum\Etoc@level>\c@tocdepth
+ \ifEtoc@standardlines
+ \let\Etoc@next\Etoc@savedcontentsline
+ \else
+ \let\Etoc@next\Etoc@etoccontentsline@
+ \fi
+ \fi
+ \fi
+ \fi
+ \Etoc@next{#1}%
+}
+\def\Etoc@etoccontentsline@ #1#2#3#4{%
+ \Etoc@doendsandbegin
+ \Etoc@global\edef\Etoc@prefix {\expandafter\noexpand
+ \csname Etoc@prefix@\the\numexpr\Etoc@level\endcsname }%
+ \Etoc@global\edef\Etoc@contents{\expandafter\noexpand
+ \csname Etoc@contents@\the\numexpr\Etoc@level\endcsname }%
+ \ifEtoc@skipprefix \Etoc@global\def\Etoc@prefix{\@empty}\fi
+ \global\Etoc@skipprefixfalse
+ \Etoc@lxyz{#2}{#3}{#4}%
+ \Etoc@prefix
+ \Etoc@contents
+}
+\def\Etoc@lxyz #1#2#3{%
+ \ifEtoc@hyperref
+ \Etoc@global\def\etocthelink##1{\hyperlink{#3}{##1}}%
+ \else
+ \Etoc@global\let\etocthelink\@firstofone
+ \fi
+ \Etoc@global\def\etocthepage {#2}%
+ \ifEtoc@hyperref
+ \ifx\etocthepage\@empty
+ \Etoc@global\let\etocthelinkedpage\@empty
+ \else
+ \Etoc@global\def\etocthelinkedpage{\hyperlink {#3}{#2}}%
+ \fi
+ \else
+ \Etoc@global\let\etocthelinkedpage\etocthepage
+ \fi
+ \Etoc@global\def\etocthename{#1}%
+ \futurelet\Etoc@getnb@token\Etoc@@getnb #1\hspace\etoc@
+ \ifEtoc@hyperref
+ \def\Etoc@tmp##1##2{\Etoc@global\def##2{\hyperlink{#3}{##1}}}%
+ \expandafter\Etoc@tmp\expandafter{\etocthename}\etocthelinkedname
+ \ifEtoc@numbered
+ \expandafter\Etoc@tmp\expandafter{\etocthenumber}\etocthelinkednumber
+ \else
+ \Etoc@global\let\etocthelinkednumber\@empty
+ \fi
+ \else
+ \Etoc@global\let\etocthelinkedname \etocthename
+ \Etoc@global\let\etocthelinkednumber\etocthenumber
+ \fi
+ \Etoc@global\expandafter\let\csname etoclink \endcsname \etocthelink
+ \Etoc@global\expandafter\let\csname etocname \endcsname \etocthename
+ \Etoc@global\expandafter\let\csname etocnumber \endcsname\etocthenumber
+ \Etoc@global\expandafter\let\csname etocpage \endcsname \etocthepage
+ \ifEtoc@hyperref
+ \Etoc@lxyz@linktoc
+ \fi
+}
+\def\Etoc@lxyz@linktoc{%
+ \ifcase\Hy@linktoc
+ \or
+ \Etoc@global\expandafter\let\csname etocname \endcsname\etocthelinkedname
+ \Etoc@global\expandafter\let\csname etocnumber \endcsname\etocthelinkednumber
+ \or % page
+ \Etoc@global\expandafter\let\csname etocpage \endcsname\etocthelinkedpage
+ \else % all
+ \Etoc@global\expandafter\let\csname etocname \endcsname\etocthelinkedname
+ \Etoc@global\expandafter\let\csname etocnumber \endcsname\etocthelinkednumber
+ \Etoc@global\expandafter\let\csname etocpage \endcsname\etocthelinkedpage
+ \fi
+}
+\def\Etoc@@getnb {%
+ \let\Etoc@next\Etoc@getnb
+ \ifx\Etoc@getnb@token\@sptoken\let\Etoc@next\Etoc@getnb@nonbr\fi
+ \ifx\Etoc@getnb@token\bgroup \let\Etoc@next\Etoc@getnb@nonbr\fi
+ \Etoc@next
+}
+\def\Etoc@getnb #1{%
+ \in@{#1}{\numberline\chapternumberline\partnumberline\booknumberline}%
+ \ifin@
+ \let\Etoc@next\Etoc@getnb@nmbrd
+ \else
+ \ifnum\Etoc@level=\m@ne
+ \let\Etoc@next\Etoc@@getit
+ \else
+ \let\Etoc@next\Etoc@getnb@nonbr
+ \fi
+ \in@{#1}{\nonumberline}%
+ \ifin@
+ \let\Etoc@next\Etoc@getnb@nonumberline
+ \fi
+ \fi
+ \Etoc@next #1%
+}
+\def\Etoc@getnb@nmbrd #1#2{%
+ \Etoc@global\Etoc@numberedtrue
+ \Etoc@global\def\etocthenumber {#2}%
+ \Etoc@getnb@nmbrd@getname\@empty
+}%
+\def\Etoc@getnb@nmbrd@getname #1\hspace\etoc@ {%
+ \Etoc@global\expandafter\def\expandafter\etocthename\expandafter{#1}%
+}
+\def\Etoc@getnb@nonbr #1\etoc@ {%
+ \Etoc@global\Etoc@numberedfalse
+ \Etoc@global\let\etocthenumber \@empty
+}
+\def\Etoc@getnb@nonumberline #1\hspace\etoc@ {%
+ \Etoc@global\Etoc@numberedfalse
+ \Etoc@global\let\etocthenumber \@empty
+ \Etoc@global\expandafter\def\expandafter\etocthename\expandafter{\@gobble#1}%
+}
+\def\Etoc@@getit #1\hspace#2{%
+ \ifx\etoc@#2%
+ \Etoc@global\Etoc@numberedfalse
+ \Etoc@global\let\etocthenumber \@empty
+ \else
+ \Etoc@global\Etoc@numberedtrue
+ \Etoc@global\def\etocthenumber {#1}%
+ \expandafter\Etoc@getit@getname \expandafter\@empty
+ \fi
+}
+\def\Etoc@getit@getname #1\hspace\etoc@ {%
+ \Etoc@global\expandafter\def\expandafter\etocthename\expandafter{#1}%
+}
+\let\etocthename \@empty
+\let\etocthenumber \@empty
+\let\etocthepage \@empty
+\let\etocthelinkedname \@empty
+\let\etocthelinkednumber \@empty
+\let\etocthelinkedpage \@empty
+\let\etocthelink \@firstofone
+\DeclareRobustCommand*{\etocname} {}
+\DeclareRobustCommand*{\etocnumber}{}
+\DeclareRobustCommand*{\etocpage} {}
+\DeclareRobustCommand*{\etoclink} {\@firstofone}
+\DeclareRobustCommand*{\etocifnumbered}
+ {\ifEtoc@numbered\expandafter\@firstoftwo\else\expandafter\@secondoftwo\fi}
+\expandafter\let\expandafter\etocxifnumbered\csname etocifnumbered \endcsname
+\DeclareRobustCommand*{\etociffirst}
+ {\ifEtoc@isfirst\expandafter\@firstoftwo\else\expandafter\@secondoftwo\fi}
+\expandafter\let\expandafter\etocxiffirst\csname etociffirst \endcsname
+\def\Etoc@readtoc {%
+ \ifeof \Etoc@tf
+ \else
+ \read \Etoc@tf to \Etoc@buffer
+ \Etoc@toctoks=\expandafter\expandafter\expandafter
+ {\expandafter\the\expandafter\Etoc@toctoks\Etoc@buffer}%
+ \expandafter\Etoc@readtoc
+ \fi
+}
+\Etoc@toctoks {}% (superfluous, but for clarity)
+\AtBeginDocument{\IfFileExists{\jobname.toc}
+ {{\endlinechar=\m@ne
+ \makeatletter
+ \newread\Etoc@tf
+ \openin\Etoc@tf\@filef@und
+ \Etoc@readtoc
+ \global\Etoc@toctoks=\expandafter{\the\Etoc@toctoks}%
+ \closein\Etoc@tf}}
+ {\typeout{No file \jobname.toc.}}}
+\def\Etoc@openouttoc{%
+ \ifEtoc@hyperref
+ \ifx\hyper@last\@undefined
+ \IfFileExists{\jobname .toc}
+ {\Hy@WarningNoLine
+ {old toc file detected; run LaTeX again (cheers from `etoc')}%
+ \global\Etoc@toctoks={}%
+ }
+ {}%
+ \fi
+ \fi
+ \if@filesw
+ \newwrite \tf@toc
+ \immediate \openout \tf@toc \jobname .toc\relax
+ \fi
+ \global\let\Etoc@openouttoc\empty
+}
+\def\Etoc@toctoc{%
+ \gdef\Etoc@stackofends{{-3}{}}%
+ \global\let\Etoc@level\Etoc@minf
+ \global\let\Etoc@virtualtop\Etoc@minf
+ \the\Etoc@toctoks
+ \ifEtoc@notactive
+ \else
+ \gdef\Etoc@level{-\thr@@}%
+ \Etoc@doendsandbegin
+ \fi
+}
+\def\Etoc@@startlocaltoc#1#2{%
+ \ifEtoc@localtoc
+ \ifnum #1=#2\relax
+ \global\let\etoclocaltop\Etoc@virtualtop
+ \Etoc@@startlocaltochook
+ \etoclocaltableofcontentshook
+ \ifEtoc@etocstyle
+ \etocetoclocaltocmaketitle
+ \fi
+ \ifx\Etoc@aftertitlehook\@empty
+ \else
+ \ifEtoc@localtoctotoc
+ \ifEtoc@ouroboros
+ \else
+ \let\Etoc@tmp\contentsline
+ \def\contentsline{\let\contentsline\Etoc@tmp\Etoc@gobblethreeorfour}%
+ \fi
+ \fi
+ \fi
+ \global\Etoc@notactivefalse
+ \fi
+ \fi
+}
+\let\etoc@startlocaltoc\@gobble
+\let\Etoc@@startlocaltoc@toc\Etoc@@startlocaltoc
+\let\Etoc@@startlocaltochook\@empty
+\unless\ifEtoc@deeplevels
+ \def\etocdivisionnameatlevel#1{%
+ \ifcase\numexpr#1\relax
+ \ifdefined\c@chapter chapter\else section\fi%
+ \or section%
+ \or subsection%
+ \or subsubsection%
+ \or paragraph%
+ \or subparagraph%
+ \or empty%
+ \else\ifnum\numexpr#1<\m@ne
+ book%
+ \else
+ part%
+ \fi
+ \fi
+ }
+\else
+ \def\etocdivisionnameatlevel#1{%
+ \ifcase\numexpr#1\relax
+ \ifdefined\c@chapter chapter\else section\fi%
+ \or section%
+ \or subsection%
+ \or subsubsection%
+ \or subsubsubsection%
+ \or subsubsubsubsection%
+ \or subsubsubsubsubsection%
+ \or subsubsubsubsubsubsection%
+ \or paragraph%
+ \or subparagraph%
+ \else\ifnum\numexpr#1>\z@
+ empty%
+ \else\ifnum\numexpr#1=\m@ne
+ part%
+ \else
+ book%
+ \fi\fi
+ \fi
+ }
+\fi
+\def\etoclocalheadtotoc#1#2{\addcontentsline{toc}{@#1}{#2}}
+\def\etocglobalheadtotoc{\addcontentsline{toc}}
+\providecommand*\UseName{\@nameuse}
+\def\etocetoclocaltocmaketitle{%
+ \UseName{\etocdivisionnameatlevel{\etoclocaltop+1}}*{\localcontentsname}%
+ \if@noskipsec\leavevmode\par\fi
+ \etociflocaltoctotoc
+ {\etocifisstarred
+ {}% star variant, do not add to toc
+ {\etoclocalheadtotoc
+ {\etocdivisionnameatlevel{\etoclocaltop+1}}%
+ {\localcontentsname}%
+ }%
+ }%
+ {}%
+}%
+\def\localcontentsname {\contentsname}%
+\let\etoclocaltableofcontentshook\@empty
+\if1\ifEtoc@lof0\fi\ifEtoc@lot0\fi1%
+\else
+\AtBeginDocument{%
+ \let\Etoc@originaladdcontentsline\addcontentsline
+ \def\addcontentsline{\Etoc@hackedaddcontentsline}%
+}%
+\fi
+\ifEtoc@lof
+ \ifEtoc@lot
+ \def\Etoc@hackedaddcontentsline#1{%
+ \expanded{\noexpand\in@{.#1,}}{.lof,.lot,}%
+ \ifin@\expandafter\Etoc@hackedaddcontentsline@i
+ \else\expandafter\Etoc@originaladdcontentsline
+ \fi {#1}}
+ \else
+ \def\Etoc@hackedaddcontentsline#1{%
+ \expanded{\noexpand\in@{.#1,}}{.lof,}%
+ \ifin@\expandafter\Etoc@hackedaddcontentsline@i
+ \else\expandafter\Etoc@originaladdcontentsline
+ \fi {#1}}
+ \fi
+\else
+ \def\Etoc@hackedaddcontentsline#1{%
+ \expanded{\noexpand\in@{.#1,}}{.lot,}%
+ \ifin@\expandafter\Etoc@hackedaddcontentsline@i
+ \else\expandafter\Etoc@originaladdcontentsline
+ \fi {#1}}
+\fi
+\def\Etoc@hackedaddcontentsline@i#1#2#3{%
+ \expanded{\noexpand\in@{.#1;#2,}}{.lof;figure,.lot;table,}%
+ \ifin@
+ \addtocontents {toc}{%
+ \protect\contentsline{#2}{#3}{\thepage}{\ifEtoc@hyperref\@currentHref\fi}%
+ \ifdefined\protected@file@percent\protected@file@percent\fi
+ }%
+ \fi
+ \Etoc@originaladdcontentsline{#1}{#2}{#3}%
+}
+\unless\ifdefined\expanded
+ \def\Etoc@hackedaddcontentsline#1{%
+ {\edef\Etoc@tmp{\noexpand\in@{.#1,}{\ifEtoc@lof.lof,\fi\ifEtoc@lot.lot,\fi}}\expandafter}%
+ \Etoc@tmp
+ \ifin@\expandafter\Etoc@hackedaddcontentsline@i
+ \else\expandafter\Etoc@originaladdcontentsline
+ \fi {#1}%
+ }
+ \def\Etoc@hackedaddcontentsline@i#1#2#3{%
+ {\edef\Etoc@tmp{\noexpand\in@{.#1;#2,}}\expandafter}%
+ \Etoc@tmp{.lof;figure,.lot;table,}%
+ \ifin@
+ \addtocontents {toc}{%
+ \protect\contentsline{#2}{#3}{\thepage}{\ifEtoc@hyperref\@currentHref\fi}%
+ \ifdefined\protected@file@percent\protected@file@percent\fi
+ }%
+ \fi
+ \Etoc@originaladdcontentsline{#1}{#2}{#3}%
+ }
+\fi
+\def\Etoc@@startlocallistof#1#2#3{%
+ \ifEtoc@localtoc
+ \ifnum #2=#3\relax
+ \global\let\etoclocaltop\Etoc@virtualtop
+ \global\Etoc@notactivefalse
+ \Etoc@@startlocaltochook
+ \csname etoclocallistof#1shook\endcsname
+ \ifEtoc@etocstyle
+ \csname etocetoclistof#1smaketitle\endcsname
+ \fi
+ \fi
+ \fi
+}
+\def\Etoc@@startlocallistof@setlevels#1{%
+ \ifnum\etoclocaltop<\z@
+ \expandafter\let\csname Etoc@#1@@\endcsname\@ne
+ \else
+ \expandafter\let\csname Etoc@#1@@\expandafter\endcsname
+ \csname Etoc@\the\numexpr\etoclocaltop+\@ne @@\endcsname
+ \fi
+ \def\Etoc@do##1{%
+ \ifnum\etoclevel{##1}>\etoclocaltop
+ \expandafter\let\csname Etoc@##1@@\endcsname\Etoc@maxlevel
+ \fi}%
+ \Etoc@dolevels
+}
+\def\etoclocallistoffigureshook{\etocstandardlines}
+\def\etoclocallistoftableshook {\etocstandardlines}
+\def\locallistfigurename{\listfigurename}
+\def\locallisttablename {\listtablename}
+\def\etocetoclistoffiguresmaketitle{%
+ \UseName{\etocdivisionnameatlevel{\etoclocaltop+1}}*{\locallistfigurename}%
+ \ifnum\etoclocaltop>\tw@\mbox{}\par\fi
+ \etociflocalloftotoc
+ {\etocifisstarred
+ {}% star variant, do not add to toc
+ {\etoclocalheadtotoc
+ {\etocdivisionnameatlevel{\etoclocaltop+1}}%
+ {\locallistfigurename}%
+ }%
+ }%
+ {}%
+}%
+\def\etocetoclistoftablesmaketitle{%
+ \UseName{\etocdivisionnameatlevel{\etoclocaltop+1}}*{\locallisttablename}%
+ \ifnum\etoclocaltop>\tw@\mbox{}\par\fi
+ \etociflocallottotoc
+ {\etocifisstarred
+ {}% star variant, do not add to toc
+ {\etoclocalheadtotoc
+ {\etocdivisionnameatlevel{\etoclocaltop+1}}%
+ {\locallisttablename}%
+ }%
+ }%
+ {}%
+}%
+\let\Etoc@listofreset\@empty
+\ifEtoc@lof
+ \def\locallistoffigures{%
+ \def\Etoc@listofreset{%
+ \let\Etoc@currext\Etoc@tocext
+ \let\Etoc@@startlocaltoc\Etoc@@startlocaltoc@toc
+ \let\Etoc@@startlocaltochook\@empty
+ \let\Etoc@listofreset\@empty
+ \let\Etoc@listofhook\@empty
+ }%
+ \let\Etoc@currext\Etoc@lofext
+ \def\Etoc@@startlocaltoc{\Etoc@@startlocallistof{figure}}%
+ \def\Etoc@@startlocaltochook{\Etoc@@startlocallistof@setlevels{figure}}%
+ \def\Etoc@listofhook{%
+ \def\Etoc@do####1{%
+ \expandafter\let\csname Etoc@@####1@@\endcsname\Etoc@maxlevel
+ }%
+ \Etoc@dolevels
+ }%
+ \localtableofcontents
+ }
+\else
+ \def\locallistoffigures{%
+ \PackageError{etoc}{%
+ \string\locallistoffigures \on@line\space but\MessageBreak
+ package was loaded without `lof' option}%
+ {Try again with \string\usepackage[lof]{etoc}}%
+ }
+\fi
+\ifEtoc@lot
+ \def\locallistoftables{%
+ \def\Etoc@listofreset{%
+ \let\Etoc@currext\Etoc@tocext
+ \let\Etoc@@startlocaltoc\Etoc@@startlocaltoc@toc
+ \let\Etoc@@startlocaltochook\@empty
+ \let\Etoc@listofreset\@empty
+ \let\Etoc@listofhook\@empty
+ }%
+ \let\Etoc@currext\Etoc@lotext
+ \def\Etoc@@startlocaltoc{\Etoc@@startlocallistof{table}}%
+ \def\Etoc@@startlocaltochook{\Etoc@@startlocallistof@setlevels{table}}%
+ \def\Etoc@listofhook{%
+ \def\Etoc@do####1{%
+ \expandafter\let\csname Etoc@@####1@@\endcsname\Etoc@maxlevel
+ }%
+ \Etoc@dolevels
+ }%
+ \localtableofcontents
+ }
+\else
+ \def\locallistoftables{%
+ \PackageError{etoc}{%
+ \string\locallistoftable \on@line\space but\MessageBreak
+ package was loaded without `lot' option}%
+ {Try again with \string\usepackage[lot]{etoc}}%
+ }
+\fi
+\def\Etoc@checkifempty {%
+ \global\Etoc@isemptytoctrue
+ \global\Etoc@stoptocfalse
+ \global\let\Etoc@level\Etoc@minf
+ \global\let\Etoc@virtualtop\Etoc@minf
+ \gdef\Etoc@stackofends{{-3}{}}%
+ \begingroup
+ \ifEtoc@localtoc
+ \def\etoc@startlocaltoc##1{%
+ \ifnum##1=\Etoc@tocid\relax
+ \global\let\etoclocaltop\Etoc@virtualtop
+ \Etoc@@startlocaltochook
+ \global\Etoc@notactivefalse
+ \fi
+ }%
+ \let\contentsline\Etoc@testingcontentslinelocal
+ \else
+ \let\contentsline\Etoc@testingcontentsline
+ \fi
+ \Etoc@storetocdepth
+ \let\Etoc@setlocaltop@doendsandbegin\@empty
+ \the\Etoc@toctoks
+ \Etoc@restoretocdepth
+ \endgroup
+}
+\DeclareRobustCommand*\etocifwasempty
+ {\ifEtoc@isemptytoc\expandafter\@firstoftwo\else\expandafter\@secondoftwo\fi }
+\expandafter\let\expandafter\etocxifwasempty\csname etocifwasempty \endcsname
+\def\Etoc@testingcontentslinelocal #1{%
+ \ifEtoc@stoptoc
+ \else
+ \ifnum\csname Etoc@#1@@\endcsname=\Etoc@maxlevel
+ \else
+ \global\expandafter\let\expandafter\Etoc@level\csname Etoc@#1@@\endcsname
+ \if @\@car#1\@nil\else\global\let\Etoc@virtualtop\Etoc@level\fi
+ \ifEtoc@notactive
+ \else
+ \ifnum\Etoc@level>\etoclocaltop
+ \unless\ifnum\Etoc@level>\c@tocdepth
+ \global\Etoc@isemptytocfalse
+ \global\Etoc@stoptoctrue
+ \fi
+ \else
+ \global\Etoc@stoptoctrue
+ \fi
+ \fi
+ \fi
+ \fi
+ \Etoc@gobblethreeorfour{}%
+}
+\def\Etoc@testingcontentsline #1{%
+ \ifEtoc@stoptoc
+ \else
+ \ifnum\csname Etoc@#1@@\endcsname=\Etoc@maxlevel
+ \else
+ \unless\ifnum\csname Etoc@#1@@\endcsname>\c@tocdepth
+ \global\Etoc@isemptytocfalse
+ \global\Etoc@stoptoctrue
+ \fi
+ \fi
+ \fi
+ \Etoc@gobblethreeorfour{}%
+}
+\def\Etoc@localtableofcontents#1{%
+ \gdef\etoclocaltop{-\@m}%
+ \Etoc@localtoctrue
+ \global\Etoc@isemptytocfalse
+ \edef\Etoc@tocid{#1}%
+ \ifnum\Etoc@tocid<\@ne
+ \setbox0\hbox{\ref{Unknown toc ref \@secondoftwo#1. \space Rerun LaTeX}}%
+ \global\Etoc@stoptoctrue
+ \gdef\etoclocaltop{-\thr@@}%
+ \Etoc@tableofcontents
+ \expandafter\Etoc@gobtoetoc@
+ \fi
+ \global\Etoc@notactivetrue
+ \ifEtoc@checksemptiness
+ \Etoc@checkifempty
+ \fi
+ \ifEtoc@isemptytoc
+ \ifEtoc@notactive
+ \setbox0\hbox{\ref{Unknown toc ID \number\Etoc@tocid. \space Rerun LaTeX}}%
+ \global\Etoc@isemptytocfalse
+ \global\Etoc@stoptoctrue
+ \gdef\etoclocaltop{-\thr@@}%
+ \Etoc@tableofcontents
+ \expandafter\expandafter\expandafter\Etoc@gobtoetoc@
+ \fi
+ \else
+ \global\Etoc@stoptocfalse
+ \global\Etoc@notactivetrue
+ \edef\etoc@startlocaltoc##1%
+ {\noexpand\Etoc@@startlocaltoc{##1}{\Etoc@tocid}}%
+ \Etoc@tableofcontents
+ \fi
+ \@gobble\etoc@
+ \endgroup\ifEtoc@mustclosegroup\endgroup\fi
+ \Etoc@tocdepthreset
+ \Etoc@listofreset
+ \etocaftertochook
+}% \Etoc@localtableofcontents
+\def\Etoc@getref #1{%
+ \@ifundefined{r@#1}
+ {0}
+ {\expandafter\Etoc@getref@i\romannumeral-`0%
+ \expandafter\expandafter\expandafter
+ \@car\csname r@#1\endcsname0\@nil\@etoc
+ }%
+}
+\def\Etoc@getref@i#1#2\@etoc{\ifnum9<1\string#1 #1#2\else 0\fi}
+\def\Etoc@ref#1{\Etoc@localtableofcontents{\Etoc@getref{#1}}}
+\def\Etoc@label#1{\label{#1}\futurelet\Etoc@nexttoken\Etoc@t@bleofcontents}
+\@firstofone{\def\Etoc@again} {\futurelet\Etoc@nexttoken\Etoc@t@bleofcontents}
+\def\Etoc@dothis #1#2\etoc@ {\fi #1}
+\def\Etoc@t@bleofcontents{%
+ \gdef\etoclocaltop{-\@M}%
+ \ifx\Etoc@nexttoken\label\Etoc@dothis{\expandafter\Etoc@label\@gobble}\fi
+ \ifx\Etoc@nexttoken\@sptoken\Etoc@dothis{\Etoc@again}\fi
+ \ifx\Etoc@nexttoken\ref\Etoc@dothis{\expandafter\Etoc@ref\@gobble}\fi
+ \ifEtoc@tocwithid\Etoc@dothis{\Etoc@localtableofcontents{\c@etoc@tocid}}\fi
+ \global\Etoc@isemptytocfalse
+ \ifEtoc@checksemptiness\Etoc@checkifempty\fi
+ \ifEtoc@isemptytoc
+ \ifEtoc@notocifnotoc
+ \expandafter\expandafter\expandafter\@gobble
+ \fi
+ \fi
+ \Etoc@tableofcontents
+ \endgroup
+ \ifEtoc@mustclosegroup\endgroup\fi
+ \Etoc@tocdepthreset
+ \Etoc@listofreset
+ \etocaftertochook
+ \@gobble\etoc@
+ }% \Etoc@t@bleofcontents
+\def\Etoc@table@fcontents{%
+ \refstepcounter{etoc@tocid}%
+ \Etoc@tocwithidfalse
+ \futurelet\Etoc@nexttoken\Etoc@t@bleofcontents
+}
+\def\Etoc@localtable@fcontents{%
+ \refstepcounter{etoc@tocid}%
+ \addtocontents{toc}{\string\etoc@startlocaltoc{\the\c@etoc@tocid}}%
+ \Etoc@tocwithidtrue
+ \futurelet\Etoc@nexttoken\Etoc@t@bleofcontents
+}
+\def\etoctableofcontents{%
+ \Etoc@openouttoc
+ \Etoc@tocdepthset
+ \begingroup
+ \@ifstar
+ {\let\Etoc@aftertitlehook\@empty\Etoc@table@fcontents}
+ {\def\Etoc@aftertitlehook{\etocaftertitlehook}\Etoc@table@fcontents}%
+}% \etoctableofcontents
+\def\etocifisstarred{\ifx\Etoc@aftertitlehook\@empty
+ \expandafter\@firstoftwo\else
+ \expandafter\@secondoftwo
+ \fi}
+\let\etocoriginaltableofcontents\tableofcontents
+\let\tableofcontents\etoctableofcontents
+\let\Etoc@listofhook\@empty
+\newcommand*\localtableofcontents{%
+ \Etoc@openouttoc
+ \Etoc@tocdepthset
+ \begingroup
+ \Etoc@listofhook
+ \@ifstar
+ {\let\Etoc@aftertitlehook\@empty\Etoc@localtable@fcontents}
+ {\def\Etoc@aftertitlehook{\etocaftertitlehook}\Etoc@localtable@fcontents}%
+}% \localtableofcontents
+\newcommand*\localtableofcontentswithrelativedepth[1]{%
+ \def\Etoc@@startlocaltochook{%
+ \global\c@tocdepth\numexpr\etoclocaltop+#1\relax
+ }%
+ \def\Etoc@listofreset{\let\Etoc@@startlocaltochook\@empty
+ \let\Etoc@listofreset\@empty}%
+ \localtableofcontents
+}% \localtableofcontentswithrelativedepth
+\newcommand\etocsettocstyle[2]{%
+ \Etoc@etocstylefalse
+ \Etoc@classstylefalse
+ \def\Etoc@tableofcontents@user@before{#1}%
+ \def\Etoc@tableofcontents@user@after {#2}%
+}%
+\def\etocstoretocstyleinto#1{%
+%% \@ifdefinable#1{%
+ \edef#1{\noexpand\Etoc@etocstylefalse\noexpand\Etoc@classstylefalse
+ \def\noexpand\Etoc@tableofcontents@user@before{%
+ \unexpanded\expandafter{\Etoc@tableofcontents@user@before}%
+ }%
+ \def\noexpand\Etoc@tableofcontents@user@after{%
+ \unexpanded\expandafter{\Etoc@tableofcontents@user@after}%
+ }%
+ }%
+%% }%
+}%
+\def\Etoc@tableofcontents {%
+ \Etoc@tableofcontents@etoc@before
+ \ifEtoc@localtoc\ifEtoc@etocstyle\expandafter\expandafter\expandafter\@gobble\fi\fi
+ \Etoc@tableofcontents@user@before
+ \Etoc@tableofcontents@contents
+ \ifEtoc@localtoc\ifEtoc@etocstyle\expandafter\expandafter\expandafter\@gobble\fi\fi
+ \Etoc@tableofcontents@user@after
+ \Etoc@tableofcontents@etoc@after
+ \@gobble\etoc@
+}
+\def\Etoc@tableofcontents@etoc@before{%
+ \ifnum\c@tocdepth>\Etoc@minf
+ \else
+ \expandafter\Etoc@gobtoetoc@
+ \fi
+ \Etoc@par
+ \Etoc@beforetitlehook
+ \etocbeforetitlehook
+ \Etoc@storetocdepth
+ \let\Etoc@savedcontentsline\contentsline
+ \let\contentsline\Etoc@etoccontentsline
+ \ifEtoc@standardlines
+ \else
+ \def\Etoc@do##1{%
+ \expandafter\def\csname etocsaved##1tocline\endcsname
+ {\PackageError{etoc}{%
+ \expandafter\string\csname etocsaved##1tocline\endcsname\space
+ has been deprecated\MessageBreak
+ at 1.1a and is removed at 1.2.\MessageBreak
+ Use \expandafter\string\csname l@##1\endcsname\space directly.\MessageBreak
+ Reported \on@line}%
+ {I will use \expandafter\string
+ \csname l@##1\endcsname\space myself for this time.%
+ }%
+ \csname l@##1\endcsname
+ }%
+ }%
+ \Etoc@dolevels
+ \fi
+}%
+\def\Etoc@tableofcontents@contents{%
+ \Etoc@tocdepthset
+ \ifEtoc@parskip\parskip\z@skip\fi
+ \Etoc@aftertitlehook
+ \gdef\etoclocaltop{-\thr@@}%
+ \Etoc@toctoc
+ \etocaftercontentshook
+}%
+\def\Etoc@tableofcontents@etoc@after{%
+ \@nobreakfalse
+ \Etoc@restoretocdepth
+ \ifx\Etoc@global\global
+ \@ifundefined{tof@finish}
+ {}
+ {\ifx\tof@finish\@empty
+ \else
+ \global\let\contentsline\Etoc@savedcontentsline
+ \fi
+ }%
+ \fi
+}
+\def\etocsetstyle#1{\ifcsname Etoc@#1@@\endcsname
+ \expandafter\Etoc@setstyle@a
+ \else
+ \expandafter\Etoc@setstyle@error
+ \fi {#1}%
+}
+\def\Etoc@setstyle@error #1{%
+ \PackageWarning{etoc}{`#1' is unknown to etoc. \space Did you\MessageBreak
+ forget some \string\etocsetlevel{#1}{}?\MessageBreak
+ Reported}%
+ \@gobblefour
+}
+\def\Etoc@setstyle@a #1{%
+ \edef\Etoc@tmp{\the\numexpr\csname Etoc@#1@@\endcsname}%
+ \if1\unless\ifnum\Etoc@tmp<\Etoc@maxlevel 0\fi
+ \unless\ifnum\Etoc@tmp>\Etoc@minf 0\fi1%
+ \Etoc@standardlinesfalse
+ \expandafter\Etoc@setstyle@b\expandafter\Etoc@tmp
+ \else
+ \ifnum\Etoc@tmp=\Etoc@maxlevel
+ \in@{.#1,}{.figure,.table,}%
+ \ifin@
+ \PackageWarning{etoc}
+ {You can not use \string\etocsetstyle\space with `#1'.\MessageBreak
+ Check the package documentation (in particular about\MessageBreak
+ \string\etoclocallistoffigureshook/\string\etoclocallistoftableshook)%
+ \MessageBreak on how to customize
+ figure and table entries in local\MessageBreak lists. Reported}%
+ \else
+ \PackageInfo{etoc}
+ {Attempt to set the style of `#1',\MessageBreak
+ whose level is currently the maximal one \etocthemaxlevel,\MessageBreak
+ which is never displayed. \space This will be ignored\MessageBreak
+ but note that we do quit compatibility mode.\MessageBreak
+ Reported}%
+ \Etoc@standardlinesfalse
+ \fi
+ \else
+ \PackageWarning{etoc}{This should not happen. Reported}%
+ \fi
+ \expandafter\@gobblefour
+ \fi
+}
+\long\def\Etoc@setstyle@b#1#2#3#4#5{%
+ \expandafter\def\csname Etoc@begin@#1\endcsname {#2}%
+ \expandafter\def\csname Etoc@prefix@#1\endcsname {#3}%
+ \expandafter\def\csname Etoc@contents@#1\endcsname {#4}%
+ \expandafter\def\csname Etoc@end@#1\endcsname {#5}%
+}
+\def\Etoc@setstyle@e#1{%
+ \expandafter\let\csname Etoc@begin@#1\endcsname \@empty
+ \expandafter\let\csname Etoc@prefix@#1\endcsname \@empty
+ \expandafter\let\csname Etoc@contents@#1\endcsname \@empty
+ \expandafter\let\csname Etoc@end@#1\endcsname \@empty
+}
+\def\Etoc@storelines@a#1{%
+ \noexpand\Etoc@setstyle@b{#1}%
+ {\expandafter\Etoc@expandonce\csname Etoc@begin@#1\endcsname}%
+ {\expandafter\Etoc@expandonce\csname Etoc@prefix@#1\endcsname}%
+ {\expandafter\Etoc@expandonce\csname Etoc@contents@#1\endcsname}%
+ {\expandafter\Etoc@expandonce\csname Etoc@end@#1\endcsname}%
+}
+\def\Etoc@expandonce#1{\unexpanded\expandafter{#1}}
+\def\etocstorelinestylesinto#1{%
+ \edef#1{\Etoc@storelines@a{-2}\Etoc@storelines@a{-1}\Etoc@storelines@a{0}%
+ \Etoc@storelines@a {1}\Etoc@storelines@a {2}\Etoc@storelines@a{3}%
+ \Etoc@storelines@a {4}\Etoc@storelines@a {5}%
+ \ifEtoc@deeplevels
+ \Etoc@storelines@a{6}\Etoc@storelines@a{7}\Etoc@storelines@a{8}%
+ \Etoc@storelines@a{9}\Etoc@storelines@a{10}\Etoc@storelines@a{11}%
+ \fi
+ }%
+}
+\def\etocstorethislinestyleinto#1#2{%
+ \edef#2{\expandafter\Etoc@storelines@a\expandafter{\number\etoclevel{#1}}}%
+}%
+\def\etocfontminustwo {\normalfont \LARGE \bfseries}
+\def\etocfontminusone {\normalfont \large \bfseries}
+\def\etocfontzero {\normalfont \large \bfseries}
+\def\etocfontone {\normalfont \normalsize \bfseries}
+\def\etocfonttwo {\normalfont \normalsize}
+\def\etocfontthree {\normalfont \footnotesize}
+\def\etocsepminustwo {4ex \@plus .5ex \@minus .5ex}
+\def\etocsepminusone {4ex \@plus .5ex \@minus .5ex}
+\def\etocsepzero {2.5ex \@plus .4ex \@minus .4ex}
+\def\etocsepone {1.5ex \@plus .3ex \@minus .3ex}
+\def\etocseptwo {.5ex \@plus .1ex \@minus .1ex}
+\def\etocsepthree {.25ex \@plus .05ex \@minus .05ex}
+\def\etocbaselinespreadminustwo {1}
+\def\etocbaselinespreadminusone {1}
+\def\etocbaselinespreadzero {1}
+\def\etocbaselinespreadone {1}
+\def\etocbaselinespreadtwo {1}
+\def\etocbaselinespreadthree {.9}
+\def\etocminustwoleftmargin {1.5em plus 0.5fil}
+\def\etocminustworightmargin {1.5em plus -0.5fil}
+\def\etocminusoneleftmargin {1em}
+\def\etocminusonerightmargin {1em}
+\def\etoctoclineleaders
+ {\hbox{\normalfont\normalsize\hb@xt@2ex {\hss.\hss}}}
+\def\etocabbrevpagename {p.~}
+\def\etocpartname {Part}
+\def\etocbookname {Book}
+\def\etocdefaultlines{%
+ \Etoc@standardlinesfalse
+ \etocdefaultlines@setbook
+ \etocdefaultlines@setpart
+ \etocdefaultlines@setchapter
+ \etocdefaultlines@setsection
+ \etocdefaultlines@setsubsection
+ \etocdefaultlines@setsubsubsection
+ \etocdefaultlines@setdeeperones
+}
+\def\etocnoprotrusion{\leavevmode\kern-\p@\kern\p@}
+\@ifclassloaded{memoir}{%
+ \def\etocdefaultlines@setbook{%
+ \Etoc@setstyle@b
+ {-2}%
+ {\addpenalty\@M\etocskipfirstprefix}
+ {\addpenalty\@secpenalty}
+ {\begingroup
+ \etocfontminustwo
+ \addvspace{\etocsepminustwo}%
+ \parindent \z@
+ \leftskip \etocminustwoleftmargin
+ \rightskip \etocminustworightmargin
+ \parfillskip \@flushglue
+ \vbox{\etocifnumbered{\etoclink{\etocbookname\enspace\etocthenumber:\quad}}{}%
+ \etocname
+ \baselineskip\etocbaselinespreadminustwo\baselineskip
+ \par}%
+ \addpenalty\@M\addvspace{\etocsepminusone}%
+ \endgroup}
+ {}%
+ }
+ }{\let\etocdefaultlines@setbook\@empty}
+\def\etocdefaultlines@setpart{%
+\Etoc@setstyle@b
+ {-1}%
+ {\addpenalty\@M\etocskipfirstprefix}
+ {\addpenalty\@secpenalty}
+ {\begingroup
+ \etocfontminusone
+ \addvspace{\etocsepminusone}%
+ \parindent \z@
+ \leftskip \etocminusoneleftmargin
+ \rightskip \etocminusonerightmargin
+ \parfillskip \@flushglue
+ \vbox{\etocifnumbered{\etoclink{\etocpartname\enspace\etocthenumber.\quad}}{}%
+ \etocname
+ \baselineskip\etocbaselinespreadminusone\baselineskip
+ \par}%
+ \addpenalty\@M\addvspace{\etocsepzero}%
+ \endgroup}
+ {}%
+}
+\def\etocdefaultlines@setchapter{%
+\Etoc@setstyle@b
+ {0}%
+ {\addpenalty\@M\etocskipfirstprefix}
+ {\addpenalty\@itempenalty}
+ {\begingroup
+ \etocfontzero
+ \addvspace{\etocsepzero}%
+ \parindent \z@ \parfillskip \@flushglue
+ \vbox{\etocifnumbered{\etocnumber.\enspace}{}\etocname
+ \baselineskip\etocbaselinespreadzero\baselineskip
+ \par}%
+ \endgroup}
+ {\addpenalty{-\@highpenalty}\addvspace{\etocsepminusone}}%
+}
+\def\etocdefaultlines@setsection{%
+\Etoc@setstyle@b
+ {1}%
+ {\addpenalty\@M\etocskipfirstprefix}
+ {\addpenalty\@itempenalty}
+ {\begingroup
+ \etocfontone
+ \addvspace{\etocsepone}%
+ \parindent \z@ \parfillskip \z@
+ \setbox\z@\vbox{\parfillskip\@flushglue
+ \etocname\par
+ \setbox\tw@\lastbox
+ \global\setbox\@ne\hbox{\unhbox\tw@\ }}%
+ \dimen\z@=\wd\@ne
+ \setbox\z@=\etoctoclineleaders
+ \advance\dimen\z@\wd\z@
+ \etocifnumbered
+ {\setbox\tw@\hbox{\etocnumber, \etocabbrevpagename\etocpage\etocnoprotrusion}}
+ {\setbox\tw@\hbox{\etocabbrevpagename\etocpage\etocnoprotrusion}}%
+ \advance\dimen\z@\wd\tw@
+ \ifdim\dimen\z@ < \linewidth
+ \vbox{\etocname~%
+ \leaders\box\z@\hfil\box\tw@
+ \baselineskip\etocbaselinespreadone\baselineskip
+ \par}%
+ \else
+ \vbox{\etocname~%
+ \leaders\copy\z@\hfil\break
+ \hbox{}\leaders\box\z@\hfil\box\tw@
+ \baselineskip\etocbaselinespreadone\baselineskip
+ \par}%
+ \fi
+ \endgroup}
+ {\addpenalty\@secpenalty\addvspace{\etocsepzero}}%
+}
+\def\etocdefaultlines@setsubsection{%
+\Etoc@setstyle@b
+ {2}%
+ {\addpenalty\@medpenalty\etocskipfirstprefix}
+ {\addpenalty\@itempenalty}
+ {\begingroup
+ \etocfonttwo
+ \addvspace{\etocseptwo}%
+ \parindent \z@ \parfillskip \z@
+ \setbox\z@\vbox{\parfillskip\@flushglue
+ \etocname\par\setbox\tw@\lastbox
+ \global\setbox\@ne\hbox{\unhbox\tw@}}%
+ \dimen\z@=\wd\@ne
+ \setbox\z@=\etoctoclineleaders
+ \advance\dimen\z@\wd\z@
+ \etocifnumbered
+ {\setbox\tw@\hbox{\etocnumber, \etocabbrevpagename\etocpage\etocnoprotrusion}}
+ {\setbox\tw@\hbox{\etocabbrevpagename\etocpage\etocnoprotrusion}}%
+ \advance\dimen\z@\wd\tw@
+ \ifdim\dimen\z@ < \linewidth
+ \vbox{\etocname~%
+ \leaders\box\z@\hfil\box\tw@
+ \baselineskip\etocbaselinespreadtwo\baselineskip
+ \par}%
+ \else
+ \vbox{\etocname~%
+ \leaders\copy\z@\hfil\break
+ \hbox{}\leaders\box\z@\hfil\box\tw@
+ \baselineskip\etocbaselinespreadtwo\baselineskip
+ \par}%
+ \fi
+ \endgroup}
+ {\addpenalty\@secpenalty\addvspace{\etocsepone}}%
+}
+\def\etocdefaultlines@setsubsubsection{%
+\Etoc@setstyle@b
+ {3}%
+ {\addpenalty\@M
+ \etocfontthree
+ \vspace{\etocsepthree}%
+ \noindent
+ \etocskipfirstprefix}
+ {\allowbreak\,--\,}
+ {\etocname}
+ {.\hfil
+ \begingroup
+ \baselineskip\etocbaselinespreadthree\baselineskip
+ \par
+ \endgroup
+ \addpenalty{-\@highpenalty}}
+}
+\def\etocdefaultlines@setdeeperones{%
+\Etoc@setstyle@e{4}%
+\Etoc@setstyle@e{5}%
+\ifEtoc@deeplevels
+ \Etoc@setstyle@e{6}%
+ \Etoc@setstyle@e{7}%
+ \Etoc@setstyle@e{8}%
+ \Etoc@setstyle@e{9}%
+ \Etoc@setstyle@e{10}%
+ \Etoc@setstyle@e{11}%
+\fi
+}
+\def\etocabovetocskip{3.5ex \@plus 1ex \@minus .2ex}
+\def\etocbelowtocskip{3.5ex \@plus 1ex \@minus .2ex}
+\def\etoccolumnsep{2em}
+\def\etocmulticolsep{0ex}
+\def\etocmulticolpretolerance{-1}
+\def\etocmulticoltolerance{200}
+\def\etocdefaultnbcol{2}
+\def\etocinnertopsep{2ex}
+\newcommand\etocmulticolstyle[2][\etocdefaultnbcol]{%
+\etocsettocstyle
+ {\let\etocoldpar\par
+ \addvspace{\etocabovetocskip}%
+ \ifnum #1>\@ne
+ \expandafter\@firstoftwo
+ \else \expandafter\@secondoftwo
+ \fi
+ {\multicolpretolerance\etocmulticolpretolerance
+ \multicoltolerance\etocmulticoltolerance
+ \setlength{\columnsep}{\etoccolumnsep}%
+ \setlength{\multicolsep}{\etocmulticolsep}%
+ \begin{multicols}{#1}[#2\etocoldpar\addvspace{\etocinnertopsep}]}
+ {#2\ifvmode\else\begingroup\interlinepenalty\@M\parskip\z@skip
+ \@@par\endgroup
+ \fi
+ \nobreak\addvspace{\etocinnertopsep}%
+ \pretolerance\etocmulticolpretolerance
+ \tolerance\etocmulticoltolerance}%
+ }%
+ {\ifnum #1>\@ne
+ \expandafter\@firstofone
+ \else \expandafter\@gobble
+ \fi
+ {\end{multicols}}%
+ \addvspace{\etocbelowtocskip}}%
+}
+\def\etocinnerbottomsep{3.5ex}
+\def\etocinnerleftsep{2em}
+\def\etocinnerrightsep{2em}
+\def\etoctoprule{\hrule}
+\def\etocleftrule{\vrule}
+\def\etocrightrule{\vrule}
+\def\etocbottomrule{\hrule}
+\def\etoctoprulecolorcmd{\relax}
+\def\etocbottomrulecolorcmd{\relax}
+\def\etocleftrulecolorcmd{\relax}
+\def\etocrightrulecolorcmd{\relax}
+\def\etoc@ruledheading #1{%
+ \hb@xt@\linewidth{\color@begingroup
+ \hss #1\hss\hskip-\linewidth
+ \etoctoprulecolorcmd\leaders\etoctoprule\hss
+ \phantom{#1}%
+ \leaders\etoctoprule\hss\color@endgroup}%
+ \nointerlineskip\nobreak\vskip\etocinnertopsep}
+\newcommand*\etocruledstyle[2][\etocdefaultnbcol]{%
+\etocsettocstyle
+ {\addvspace{\etocabovetocskip}%
+ \ifnum #1>\@ne
+ \expandafter\@firstoftwo
+ \else \expandafter\@secondoftwo
+ \fi
+ {\multicolpretolerance\etocmulticolpretolerance
+ \multicoltolerance\etocmulticoltolerance
+ \setlength{\columnsep}{\etoccolumnsep}%
+ \setlength{\multicolsep}{\etocmulticolsep}%
+ \begin{multicols}{#1}[\etoc@ruledheading{#2}]}
+ {\etoc@ruledheading{#2}%
+ \pretolerance\etocmulticolpretolerance
+ \tolerance\etocmulticoltolerance}}
+ {\ifnum #1>\@ne\expandafter\@firstofone
+ \else \expandafter\@gobble
+ \fi
+ {\end{multicols}}%
+ \addvspace{\etocbelowtocskip}}}
+\def\etocframedmphook{\relax}
+\long\def\etocbkgcolorcmd{\relax}
+\long\def\Etoc@relax{\relax}
+\newbox\etoc@framed@titlebox
+\newbox\etoc@framed@contentsbox
+\newcommand*\etocframedstyle[2][\etocdefaultnbcol]{%
+\etocsettocstyle{%
+ \addvspace{\etocabovetocskip}%
+ \sbox\z@{#2}%
+ \dimen\z@\dp\z@
+ \ifdim\wd\z@<\linewidth \dp\z@\z@ \else \dimen\z@\z@ \fi
+ \setbox\etoc@framed@titlebox=\hb@xt@\linewidth{\color@begingroup
+ \hss
+ \ifx\etocbkgcolorcmd\Etoc@relax
+ \else
+ \sbox\tw@{\color{white}%
+ \vrule\@width\wd\z@\@height\ht\z@\@depth\dimen\z@}%
+ \ifdim\wd\z@<\linewidth \dp\tw@\z@\fi
+ \box\tw@
+ \hskip-\wd\z@
+ \fi
+ \copy\z@
+ \hss
+ \hskip-\linewidth
+ \etoctoprulecolorcmd\leaders\etoctoprule\hss
+ \hskip\wd\z@
+ \etoctoprulecolorcmd\leaders\etoctoprule\hss\color@endgroup}%
+ \setbox\z@\hbox{\etocleftrule\etocrightrule}%
+ \dimen\tw@\linewidth\advance\dimen\tw@-\wd\z@
+ \advance\dimen\tw@-\etocinnerleftsep
+ \advance\dimen\tw@-\etocinnerrightsep
+ \setbox\etoc@framed@contentsbox=\vbox\bgroup
+ \hsize\dimen\tw@
+ \kern\dimen\z@
+ \vskip\etocinnertopsep
+ \hbox\bgroup
+ \begin{minipage}{\hsize}%
+ \etocframedmphook
+ \ifnum #1>\@ne
+ \expandafter\@firstoftwo
+ \else \expandafter\@secondoftwo
+ \fi
+ {\multicolpretolerance\etocmulticolpretolerance
+ \multicoltolerance\etocmulticoltolerance
+ \setlength{\columnsep}{\etoccolumnsep}%
+ \setlength{\multicolsep}{\etocmulticolsep}%
+ \begin{multicols}{#1}}
+ {\pretolerance\etocmulticolpretolerance
+ \tolerance\etocmulticoltolerance}}
+ {\ifnum #1>\@ne\expandafter\@firstofone
+ \else \expandafter\@gobble
+ \fi
+ {\end{multicols}\unskip }%
+ \end{minipage}%
+ \egroup
+ \vskip\etocinnerbottomsep
+ \egroup
+ \vbox{\hsize\linewidth
+ \ifx\etocbkgcolorcmd\Etoc@relax
+ \else
+ \kern\ht\etoc@framed@titlebox
+ \kern\dp\etoc@framed@titlebox
+ \hb@xt@\linewidth{\color@begingroup
+ \etocleftrulecolorcmd\etocleftrule
+ \etocbkgcolorcmd
+ \leaders\vrule
+ \@height\ht\etoc@framed@contentsbox
+ \@depth\dp\etoc@framed@contentsbox
+ \hss
+ \etocrightrulecolorcmd\etocrightrule
+ \color@endgroup}\nointerlineskip
+ \vskip-\dp\etoc@framed@contentsbox
+ \vskip-\ht\etoc@framed@contentsbox
+ \vskip-\dp\etoc@framed@titlebox
+ \vskip-\ht\etoc@framed@titlebox
+ \fi
+ \box\etoc@framed@titlebox\nointerlineskip
+ \hb@xt@\linewidth{\color@begingroup
+ {\etocleftrulecolorcmd\etocleftrule}%
+ \hss\box\etoc@framed@contentsbox\hss
+ \etocrightrulecolorcmd\etocrightrule\color@endgroup}
+ \nointerlineskip
+ \vskip\ht\etoc@framed@contentsbox
+ \vskip\dp\etoc@framed@contentsbox
+ \hb@xt@\linewidth{\color@begingroup\etocbottomrulecolorcmd
+ \leaders\etocbottomrule\hss\color@endgroup}}
+ \addvspace{\etocbelowtocskip}}}
+\newcommand\etoc@multicoltoc[2][\etocdefaultnbcol]{%
+ \etocmulticolstyle[#1]{#2}%
+ \tableofcontents}
+\newcommand\etoc@multicoltoci[2][\etocdefaultnbcol]{%
+ \etocmulticolstyle[#1]{#2}%
+ \tableofcontents*}
+\newcommand\etoc@local@multicoltoc[2][\etocdefaultnbcol]{%
+ \etocmulticolstyle[#1]{#2}%
+ \localtableofcontents}
+\newcommand\etoc@local@multicoltoci[2][\etocdefaultnbcol]{%
+ \etocmulticolstyle[#1]{#2}%
+ \localtableofcontents*}
+\newcommand*\etoc@ruledtoc[2][\etocdefaultnbcol]{%
+ \etocruledstyle[#1]{#2}%
+ \tableofcontents}
+\newcommand*\etoc@ruledtoci[2][\etocdefaultnbcol]{%
+ \etocruledstyle[#1]{#2}%
+ \tableofcontents*}
+\newcommand*\etoc@local@ruledtoc[2][\etocdefaultnbcol]{%
+ \etocruledstyle[#1]{#2}%
+ \localtableofcontents}
+\newcommand*\etoc@local@ruledtoci[2][\etocdefaultnbcol]{%
+ \etocruledstyle[#1]{#2}%
+ \localtableofcontents*}
+\newcommand*\etoc@framedtoc[2][\etocdefaultnbcol]{%
+ \etocframedstyle[#1]{#2}%
+ \tableofcontents}
+\newcommand*\etoc@framedtoci[2][\etocdefaultnbcol]{%
+ \etocframedstyle[#1]{#2}%
+ \tableofcontents*}
+\newcommand*\etoc@local@framedtoc[2][\etocdefaultnbcol]{%
+ \etocframedstyle[#1]{#2}%
+ \localtableofcontents}
+\newcommand*\etoc@local@framedtoci[2][\etocdefaultnbcol]{%
+ \etocframedstyle[#1]{#2}%
+ \localtableofcontents*}
+\def\etocmulticol{\begingroup
+ \Etoc@mustclosegrouptrue
+ \@ifstar
+ {\etoc@multicoltoci}
+ {\etoc@multicoltoc}}
+\def\etocruled{\begingroup
+ \Etoc@mustclosegrouptrue
+ \@ifstar
+ {\etoc@ruledtoci}
+ {\etoc@ruledtoc}}
+\def\etocframed{\begingroup
+ \Etoc@mustclosegrouptrue
+ \@ifstar
+ {\etoc@framedtoci}
+ {\etoc@framedtoc}}
+\def\etoclocalmulticol{\begingroup
+ \Etoc@mustclosegrouptrue
+ \@ifstar
+ {\etoc@local@multicoltoci}
+ {\etoc@local@multicoltoc}}
+\def\etoclocalruled{\begingroup
+ \Etoc@mustclosegrouptrue
+ \@ifstar
+ {\etoc@local@ruledtoci}
+ {\etoc@local@ruledtoc}}
+\def\etoclocalframed{\begingroup
+ \Etoc@mustclosegrouptrue
+ \@ifstar
+ {\etoc@local@framedtoci}
+ {\etoc@local@framedtoc}}
+\def\etocmemoirtoctotocfmt #1#2{%
+ \PackageWarning{etoc}
+ {\string\etocmemoirtoctotocfmt\space is deprecated.\MessageBreak
+ Use in its place \string\etocsettoclineforclasstoc,\MessageBreak
+ and \string\etocsettoclineforclasslistof{toc} (or {lof}, {lot}).
+ I will do this now.\MessageBreak
+ Reported}%
+ \etocsettoclineforclasstoc{#1}{#2}%
+ \etocsettoclineforclasslistof{toc}{#1}{#2}%
+}
+\def\etocsettoclineforclasstoc #1#2{%
+ \def\etocclassmaintocaddtotoc{\etocglobalheadtotoc{#1}{#2}}%
+}
+\def\etocsettoclineforclasslistof #1#2#3{%
+ \@namedef{etocclasslocal#1addtotoc}{\etoclocalheadtotoc{#2}{#3}}%
+}
+\let\etocclasslocaltocaddtotoc\@empty
+\let\etocclasslocallofaddtotoc\@empty
+\let\etocclasslocallotaddtotoc\@empty
+\ifdefined\c@chapter
+ \def\etocclasslocaltocmaketitle{\section*{\localcontentsname}}
+ \def\etocclasslocallofmaketitle{\section*{\locallistfigurename}}
+ \def\etocclasslocallotmaketitle{\section*{\locallisttablename}}
+ \etocsettoclineforclasstoc {chapter}{\contentsname}
+ \etocsettoclineforclasslistof{toc}{section}{\localcontentsname}
+ \etocsettoclineforclasslistof{lof}{section}{\locallistfigurename}
+ \etocsettoclineforclasslistof{lot}{section}{\locallisttablename}
+\else
+ \def\etocclasslocaltocmaketitle{\subsection*{\localcontentsname}}%
+ \def\etocclasslocallofmaketitle{\subsection*{\locallistfigurename}}%
+ \def\etocclasslocallotmaketitle{\subsection*{\locallisttablename}}%
+ \etocsettoclineforclasstoc {section}{\contentsname}
+ \etocsettoclineforclasslistof{toc}{subsection}{\localcontentsname}
+ \etocsettoclineforclasslistof{lof}{subsection}{\locallistfigurename}
+ \etocsettoclineforclasslistof{lot}{subsection}{\locallisttablename}
+\fi
+\def\etocclasslocalperhapsaddtotoc #1{%
+ \etocifisstarred
+ {}
+ {\csname ifEtoc@local#1totoc\endcsname
+ \csname etocclasslocal#1addtotoc\endcsname
+ \fi
+ }%
+}
+\def\etocarticlestyle{%
+ \etocsettocstyle
+ {\ifEtoc@localtoc
+ \@nameuse{etocclasslocal\Etoc@currext maketitle}%
+ \etocclasslocalperhapsaddtotoc\Etoc@currext
+ \else
+ \section *{\contentsname
+ \@mkboth {\MakeUppercase \contentsname}
+ {\MakeUppercase \contentsname}}%
+ \etocifisstarred{}{\etocifmaintoctotoc{\etocclassmaintocaddtotoc}{}}%
+ \fi
+ }
+ {}%
+}
+\def\etocarticlestylenomarks{%
+ \etocsettocstyle
+ {\ifEtoc@localtoc
+ \@nameuse{etocclasslocal\Etoc@currext maketitle}%
+ \etocclasslocalperhapsaddtotoc\Etoc@currext
+ \else
+ \section *{\contentsname}%
+ \etocifisstarred{}{\etocifmaintoctotoc{\etocclassmaintocaddtotoc}{}}%
+ \fi
+ }
+ {}%
+}
+\def\etocbookstyle{%
+ \etocsettocstyle
+ {\if@twocolumn \@restonecoltrue \onecolumn \else \@restonecolfalse \fi
+ \ifEtoc@localtoc
+ \@nameuse{etocclasslocal\Etoc@currext maketitle}%
+ \etocclasslocalperhapsaddtotoc\Etoc@currext
+ \else
+ \chapter *{\contentsname
+ \@mkboth {\MakeUppercase \contentsname}
+ {\MakeUppercase \contentsname}}%
+ \etocifisstarred{}{\etocifmaintoctotoc{\etocclassmaintocaddtotoc}{}}%
+ \fi
+ }%
+ {\if@restonecol \twocolumn \fi}%
+}
+\def\etocbookstylenomarks{%
+ \etocsettocstyle
+ {\if@twocolumn \@restonecoltrue \onecolumn \else \@restonecolfalse \fi
+ \ifEtoc@localtoc
+ \@nameuse{etocclasslocal\Etoc@currext maketitle}%
+ \etocclasslocalperhapsaddtotoc\Etoc@currext
+ \else
+ \chapter *{\contentsname}%
+ \etocifisstarred{}{\etocifmaintoctotoc{\etocclassmaintocaddtotoc}{}}%
+ \fi
+ }%
+ {\if@restonecol \twocolumn \fi}%
+}
+\let\etocreportstyle\etocbookstyle
+\let\etocreportstylenomarks\etocbookstylenomarks
+\def\etocmemoirstyle{%
+ \etocsettocstyle
+ {\ensureonecol \par \begingroup \phantomsection
+ \ifx\Etoc@aftertitlehook\@empty
+ \else
+ \ifmem@em@starred@listof
+ \else
+ \ifEtoc@localtoc
+ \etocclasslocalperhapsaddtotoc\Etoc@currext
+ \else
+ \ifEtoc@maintoctotoc
+ \etocclassmaintocaddtotoc
+ \fi
+ \fi
+ \fi
+ \fi
+ \ifEtoc@localtoc
+ \@namedef{@\Etoc@currext maketitle}{%
+ \@nameuse{etocclasslocal\Etoc@currext maketitle}%
+ }%
+ \fi
+ \@nameuse {@\Etoc@currext maketitle} %<< space token here from memoir code
+ \ifx\Etoc@aftertitlehook\@empty
+ \else
+ \Etoc@aftertitlehook \let \Etoc@aftertitlehook \relax
+ \fi
+ \parskip \cftparskip \@nameuse {cft\Etoc@currext beforelisthook}%
+ }%
+ {\@nameuse {cft\Etoc@currext afterlisthook}%
+ \endgroup\restorefromonecol
+ }%
+}
+\let\Etoc@beforetitlehook\@empty
+\if1\@ifclassloaded{scrartcl}0{\@ifclassloaded{scrbook}0{\@ifclassloaded{scrreprt}01}}%
+\expandafter\@gobble
+\else
+ \ifdefined\setuptoc
+ \def\Etoc@beforetitlehook{%
+ \ifEtoc@localtoc
+ \etocclasslocalperhapsaddtotoc\Etoc@currext
+ \setuptoc{\Etoc@currext}{leveldown}%
+ \else
+ \etocifisstarred{}{\etocifmaintoctotoc{\setuptoc{toc}{totoc}}}%
+ \fi
+ }%
+ \fi
+\expandafter\@firstofone
+\fi
+{\def\etocclasslocalperhapsaddtotoc #1{%
+ \etocifisstarred
+ {}%
+ {\csname ifEtoc@local#1totoc\endcsname
+ \setuptoc{\Etoc@currext}{totoc}%
+ \fi
+ }%
+ }%
+}
+\ifdefined\Iftocfeature
+ \def\etoc@Iftocfeature{\Iftocfeature}%
+\else
+ \def\etoc@Iftocfeature{\iftocfeature}%
+\fi
+\def\etocscrartclstyle{%
+ \etocsettocstyle
+ {\ifx\Etoc@currext\Etoc@tocext
+ \expandafter\@firstofone
+ \else
+ \expandafter\@gobble
+ \fi
+ {\let\if@dynlist\if@tocleft}%
+ \edef\@currext{\Etoc@currext}%
+ \@ifundefined{listof\@currext name}%
+ {\def\list@fname{\listofname~\@currext}}%
+ {\expandafter\let\expandafter\list@fname
+ \csname listof\@currext name\endcsname}%
+ \etoc@Iftocfeature {\@currext}{onecolumn}
+ {\etoc@Iftocfeature {\@currext}{leveldown}
+ {}
+ {\if@twocolumn \aftergroup \twocolumn \onecolumn \fi }}
+ {}%
+ \etoc@Iftocfeature {\@currext}{numberline}%
+ {\def \nonumberline {\numberline {}}}{}%
+ \expandafter\tocbasic@listhead\expandafter {\list@fname}%
+ \begingroup \expandafter \expandafter \expandafter
+ \endgroup \expandafter
+ \ifx
+ \csname microtypesetup\endcsname \relax
+ \else
+ \etoc@Iftocfeature {\@currext}{noprotrusion}{}
+ {\microtypesetup {protrusion=false}%
+ \PackageInfo {tocbasic}%
+ {character protrusion at \@currext\space deactivated}}%
+ \fi
+ \etoc@Iftocfeature{\@currext}{noparskipfake}{}{%
+ \ifvmode \@tempskipa\lastskip \vskip-\lastskip
+ \addtolength{\@tempskipa}{\parskip}\vskip\@tempskipa\fi
+ }%
+ \setlength {\parskip }{\z@ }%
+ \setlength {\parindent }{\z@ }%
+ \setlength {\parfillskip }{\z@ \@plus 1fil}%
+ \csname tocbasic@@before@hook\endcsname
+ \csname tb@\@currext @before@hook\endcsname
+ }% end of before_toc
+ {% start of after_toc
+ \providecommand\tocbasic@end@toc@file{}\tocbasic@end@toc@file
+ \edef\@currext{\Etoc@currext}%
+ \csname tb@\@currext @after@hook\endcsname
+ \csname tocbasic@@after@hook\endcsname
+ }% end of after_toc
+}
+\let\etocscrbookstyle\etocscrartclstyle
+\let\etocscrreprtstyle\etocscrartclstyle
+\def\etocclasstocstyle{\etocarticlestyle}
+\newcommand*\etocmarkboth[1]{%
+ \@mkboth{\MakeUppercase{#1}}{\MakeUppercase{#1}}}
+\newcommand*\etocmarkbothnouc[1]{\@mkboth{#1}{#1}}
+\newcommand\etoctocstyle[3][section]{\etocmulticolstyle[#2]%
+ {\csname #1\endcsname *{#3}}}
+\newcommand\etoctocstylewithmarks[4][section]{\etocmulticolstyle[#2]%
+ {\csname #1\endcsname *{#3\etocmarkboth{#4}}}}
+\newcommand\etoctocstylewithmarksnouc[4][section]{\etocmulticolstyle[#2]%
+ {\csname #1\endcsname *{#3\etocmarkbothnouc{#4}}}}
+\def\Etoc@redefetocstylesforchapters{%
+ \renewcommand\etoctocstylewithmarks[4][chapter]{%
+ \etocmulticolstyle[##2]{\csname ##1\endcsname *{##3\etocmarkboth{##4}}}%
+ }
+ \renewcommand\etoctocstylewithmarksnouc[4][chapter]{%
+ \etocmulticolstyle[##2]{\csname ##1\endcsname *{##3\etocmarkbothnouc{##4}}}%
+ }
+ \renewcommand\etoctocstyle[3][chapter]{%
+ \etocmulticolstyle[##2]{\csname ##1\endcsname *{##3}}
+ }
+}
+\@ifclassloaded{scrartcl}
+ {\renewcommand*\etocclasstocstyle{\etocscrartclstyle}}{}
+\@ifclassloaded{book}
+ {\renewcommand*\etocfontone{\normalfont\normalsize}
+ \renewcommand*\etocclasstocstyle{\etocbookstyle}
+ \Etoc@redefetocstylesforchapters}{}
+\@ifclassloaded{report}
+ {\renewcommand*\etocfontone{\normalfont\normalsize}
+ \renewcommand*\etocclasstocstyle{\etocreportstyle}
+ \Etoc@redefetocstylesforchapters}{}
+\@ifclassloaded{scrbook}
+ {\renewcommand*\etocfontone{\normalfont\normalsize}
+ \renewcommand*\etocclasstocstyle{\etocscrbookstyle}
+ \Etoc@redefetocstylesforchapters}{}
+\@ifclassloaded{scrreprt}
+ {\renewcommand*\etocfontone{\normalfont\normalsize}
+ \renewcommand*\etocclasstocstyle{\etocscrreprtstyle}
+ \Etoc@redefetocstylesforchapters}{}
+\@ifclassloaded{memoir}
+ {\renewcommand*\etocfontone{\normalfont\normalsize}
+ \renewcommand*\etocclasstocstyle{\etocmemoirstyle}
+ \Etoc@redefetocstylesforchapters}{}
+\def\etoctocloftstyle {%
+ \etocsettocstyle{%
+ \@cfttocstart
+ \par
+ \begingroup
+ \parindent\z@ \parskip\cftparskip
+ \@nameuse{@cftmake\Etoc@currext title}%
+ \ifEtoc@localtoc
+ \etoctocloftlocalperhapsaddtotoc\Etoc@currext
+ \else
+ \etocifisstarred {}{\ifEtoc@maintoctotoc\@cftdobibtoc\fi}%
+ \fi
+ }%
+ {%
+ \endgroup
+ \@cfttocfinish
+ }%
+}
+\def\etoctocloftlocalperhapsaddtotoc#1{%
+ \etocifisstarred
+ {}%
+ {\csname ifEtoc@local#1totoc\endcsname
+ \ifdefined\c@chapter\def\@tocextra{@section}\else\def\@tocextra{@subsection}\fi
+ \csname @cftdobib#1\endcsname
+ \fi
+ }%
+}
+\def\etoctocbibindstyle {%
+ \etocsettocstyle {%
+ \toc@start
+ \ifEtoc@localtoc
+ \@nameuse{etocclasslocal\Etoc@currext maketitle}%
+ \etocclasslocalperhapsaddtotoc\Etoc@currext
+ \else
+ \etoc@tocbibind@dotoctitle
+ \fi
+ }%
+ {\toc@finish}%
+}
+\def\etoc@tocbibind@dotoctitle {%
+ \if@bibchapter
+ \etocifisstarred
+ {\chapter*{\contentsname}\prw@mkboth{\contentsname} % id.
+ }%
+ {\ifEtoc@maintoctotoc
+ \toc@chapter{\contentsname} %<-space from original
+ \else
+ \chapter*{\contentsname}\prw@mkboth{\contentsname} % id.
+ \fi
+ }%
+ \else
+ \etocifisstarred
+ {\@nameuse{\@tocextra}*{\contentsname\prw@mkboth{\contentsname}} %<-space
+ }
+ {\ifEtoc@maintoctotoc
+ \toc@section{\@tocextra}{\contentsname} %<-space from original
+ \else
+ \@nameuse{\@tocextra}*{\contentsname\prw@mkboth{\contentsname}} % id.
+ \fi
+ }%
+ \fi
+}%
+\@ifclassloaded{memoir}
+{}
+{% memoir not loaded
+ \@ifpackageloaded{tocloft}
+ {\if@cftnctoc\else
+ \ifEtoc@keeporiginaltoc
+ \else
+ \AtBeginDocument{\let\tableofcontents\etoctableofcontents}%
+ \fi
+ \fi }
+ {\AtBeginDocument
+ {\@ifpackageloaded{tocloft}
+ {\if@cftnctoc\else
+ \PackageWarningNoLine {etoc}
+ {Package `tocloft' was loaded after `etoc'.\MessageBreak
+ To prevent it from overwriting \protect\tableofcontents, it will\MessageBreak
+ be tricked into believing to have been loaded with its\MessageBreak
+ option `titles'. \space But this will cause the `tocloft'\MessageBreak
+ customization of the titles of the main list of figures\MessageBreak
+ and list of tables to not apply either.\MessageBreak
+ You should load `tocloft' before `etoc'.}%
+ \AtEndDocument{\PackageWarning{etoc}
+ {Please load `tocloft' before `etoc'!\@gobbletwo}}%
+ \fi
+ \@cftnctoctrue }%
+ {}%
+ }%
+ }%
+}
+\@ifclassloaded{memoir}
+{}
+{% memoir not loaded
+ \AtBeginDocument{%
+ \@ifpackageloaded{tocloft}
+ {%
+ \def\etocclasstocstyle{%
+ \etoctocloftstyle
+ \Etoc@classstyletrue
+ }%
+ \ifEtoc@etocstyle
+ \ifEtoc@classstyle
+ \etocclasstocstyle
+ \Etoc@etocstyletrue
+ \fi
+ \else
+ \ifEtoc@classstyle
+ \etocclasstocstyle
+ \fi
+ \fi
+ }%
+ {% no tocloft
+ \@ifpackageloaded {tocbibind}
+ {\if@dotoctoc
+ \def\etocclasstocstyle{%
+ \etoctocbibindstyle
+ \Etoc@classstyletrue
+ }%
+ \ifEtoc@etocstyle
+ \ifEtoc@classstyle
+ \etocclasstocstyle
+ \Etoc@etocstyletrue
+ \fi
+ \else
+ \ifEtoc@classstyle
+ \etocclasstocstyle
+ \fi
+ \fi
+ \ifEtoc@keeporiginaltoc
+ \else
+ \let\tableofcontents\etoctableofcontents
+ \fi
+ }%
+ {}%
+ }%
+ \@ifpackageloaded{tocbibind}
+ {% tocbibind, perhaps with tocloft
+ \if@dotoctoc
+ \ifEtoc@keeporiginaltoc
+ \else
+ \let\tableofcontents\etoctableofcontents
+ \fi
+ \etocsetup{maintoctotoc,localtoctotoc}%
+ \PackageInfo{etoc}{%
+ Setting (or re-setting) the options `maintoctotoc' and\MessageBreak
+ `localtoctotoc' to true as tocbibind was detected and\MessageBreak
+ found to be configured for `TOC to toc'.\MessageBreak
+ Reported at begin document}%
+ \fi
+ \if@dotoclof
+ \ifEtoc@lof
+ \etocsetup{localloftotoc}%
+ \PackageInfo{etoc}{%
+ Setting (or re-setting) `localloftotoc=true' as the\MessageBreak
+ package tocbibind was detected and is configured for\MessageBreak
+ `LOF to toc'. Reported at begin document}%
+ \fi
+ \fi
+ \if@dotoclot
+ \ifEtoc@lot
+ \etocsetup{locallottotoc}%
+ \PackageInfo{etoc}{%
+ Setting (or re-setting) `locallottotoc=true' as the\MessageBreak
+ package tocbibind was detected and is configured for\MessageBreak
+ `LOT to toc'. Reported at begin document}%
+ \fi
+ \fi
+ }% end of tocbibind branch
+ {}%
+ }% end of at begin document
+}% end of not with memoir branch
+\def\Etoc@addtocontents #1#2{%
+ \addtocontents {toc}{%
+ \protect\contentsline{#1}{#2}{\thepage}{\ifEtoc@hyperref\@currentHref\fi}%
+ \ifdefined\protected@file@percent\protected@file@percent\fi
+ }%
+}
+\def\Etoc@addcontentsline@ #1#2#3{%
+ \@namedef{toclevel@#1}{#3}\addcontentsline {toc}{#1}{#2}%
+}
+\DeclareRobustCommand*{\etoctoccontentsline}
+ {\@ifstar{\Etoc@addcontentsline@}{\Etoc@addtocontents}}
+\def\Etoc@addtocontents@immediately#1#2{%
+ \begingroup
+ \let\Etoc@originalwrite\write
+ \def\write{\immediate\Etoc@originalwrite}%
+ \Etoc@addtocontents{#1}{#2}%
+ \endgroup
+}
+\def\Etoc@addcontentsline@@immediately#1#2#3{%
+ \begingroup
+ \let\Etoc@originalwrite\write
+ \def\write{\immediate\Etoc@originalwrite}%
+ \Etoc@addcontentsline@{#1}{#2}{#3}%
+ \endgoroup
+}
+\DeclareRobustCommand*{\etocimmediatetoccontentsline}
+ {\@ifstar{\Etoc@addcontentsline@@immediately}{\Etoc@addtocontents@immediately}}
+\def\Etoc@storetocdepth {\xdef\Etoc@savedtocdepth{\number\c@tocdepth}}
+\def\Etoc@restoretocdepth {\global\c@tocdepth\Etoc@savedtocdepth\relax}
+\def\etocobeytoctocdepth {\def\etoc@settocdepth
+ {\afterassignment\Etoc@@nottoodeep \global\c@tocdepth}}
+\def\Etoc@@nottoodeep {\ifnum\Etoc@savedtocdepth<\c@tocdepth
+ \global\c@tocdepth\Etoc@savedtocdepth\relax\fi }
+\def\etocignoretoctocdepth {\let\etoc@settocdepth\@gobble }
+\def\etocsettocdepth {\futurelet\Etoc@nexttoken\Etoc@set@tocdepth }
+\def\Etoc@set@tocdepth {\ifx\Etoc@nexttoken\bgroup
+ \expandafter\Etoc@set@tocdepth@
+ \else\expandafter\Etoc@set@toctocdepth
+ \fi }
+\def\Etoc@set@tocdepth@ #1{\@ifundefined {Etoc@#1@@}
+ {\PackageWarning{etoc}
+ {Unknown sectioning unit #1, \protect\etocsettocdepth\space ignored}}
+ {\global\c@tocdepth\csname Etoc@#1@@\endcsname}%
+}
+\def\Etoc@set@toctocdepth #1#{\Etoc@set@toctocdepth@ }
+\def\Etoc@set@toctocdepth@ #1{%
+ \@ifundefined{Etoc@#1@@}%
+ {\PackageWarning{etoc}
+ {Unknown sectioning depth #1, \protect\etocsettocdepth.toc ignored}}%
+ {\addtocontents {toc}
+ {\protect\etoc@settocdepth\expandafter\protect\csname Etoc@#1@@\endcsname}}%
+}
+\def\etocimmediatesettocdepth #1#{\Etoc@set@toctocdepth@immediately}
+\def\Etoc@set@toctocdepth@immediately #1{%
+ \@ifundefined{Etoc@#1@@}%
+ {\PackageWarning{etoc}
+ {Unknown sectioning depth #1, \protect\etocimmediatesettocdepth.toc ignored}}%
+ {\begingroup
+ \let\Etoc@originalwrite\write
+ \def\write{\immediate\Etoc@originalwrite}%
+ \addtocontents {toc}
+ {\protect\etoc@settocdepth\expandafter\protect
+ \csname Etoc@#1@@\endcsname}%
+ \endgroup
+ }%
+}
+\def\etocdepthtag #1#{\Etoc@depthtag }
+\def\Etoc@depthtag #1{\addtocontents {toc}{\protect\etoc@depthtag {#1}}}
+\def\etocimmediatedepthtag #1#{\Etoc@depthtag@immediately }
+\def\Etoc@depthtag@immediately #1{%
+ \begingroup
+ \let\Etoc@originalwrite\write
+ \def\write{\immediate\Etoc@originalwrite}%
+ \addtocontents {toc}{\protect\etoc@depthtag {#1}}%
+ \endgroup
+}
+\def\etocignoredepthtags {\let\etoc@depthtag \@gobble }
+\def\etocobeydepthtags {\let\etoc@depthtag \Etoc@depthtag@ }
+\def\Etoc@depthtag@ #1{\@ifundefined{Etoc@depthof@#1}%
+ {}% ignore in silence if tag has no associated depth
+ {\afterassignment\Etoc@@nottoodeep
+ \global\c@tocdepth\csname Etoc@depthof@#1\endcsname}%
+}
+\def\etocsettagdepth #1#2{\@ifundefined{Etoc@#2@@}%
+ {\PackageWarning{etoc}
+ {Unknown sectioning depth #2, \protect\etocsettagdepth\space ignored}}%
+ {\@namedef{Etoc@depthof@#1}{\@nameuse{Etoc@#2@@}}}%
+}
+\def\Etoc@tocvsec@err #1{\PackageError {etoc}
+ {The command \protect#1\space is incompatible with `etoc'}
+ {Use \protect\etocsettocdepth.toc as replacement}%
+}%
+\AtBeginDocument {%
+ \@ifclassloaded{memoir}
+ {\PackageInfo {etoc}
+ {Regarding `memoir' class command \protect\settocdepth, consider\MessageBreak
+ \protect\etocsettocdepth.toc as a drop-in replacement with more\MessageBreak
+ capabilities (see `etoc' manual). \space
+ Also, \protect\etocsettocdepth\MessageBreak
+ and \protect\etocsetnexttocdepth\space should be used in place of\MessageBreak
+ `memoir' command \protect\maxtocdepth\@gobble}%
+ }%
+ {\@ifpackageloaded {tocvsec2}{%
+ \def\maxtocdepth #1{\Etoc@tocvsec@err \maxtocdepth }%
+ \def\settocdepth #1{\Etoc@tocvsec@err \settocdepth }%
+ \def\resettocdepth {\@ifstar {\Etoc@tocvsec@err \resettocdepth }%
+ {\Etoc@tocvsec@err \resettocdepth }%
+ }%
+ \def\save@tocdepth #1#2#3{}%
+ \let\reset@tocdepth\relax
+ \let\remax@tocdepth\relax
+ \let\tableofcontents\etoctableofcontents
+ \PackageWarningNoLine {etoc}
+ {Package `tocvsec2' detected and its modification of\MessageBreak
+ \protect\tableofcontents\space reverted. \space Use
+ \protect\etocsettocdepth.toc\MessageBreak as a replacement
+ for `tocvsec2' toc-related commands}%
+ }% tocvsec2 loaded
+ {}% tocvsec2 not loaded
+ }%
+}%
+\def\invisibletableofcontents {\etocsetnexttocdepth {-3}\tableofcontents }%
+\def\invisiblelocaltableofcontents
+ {\etocsetnexttocdepth {-3}\localtableofcontents }%
+\def\etocsetnexttocdepth #1{%
+ \@ifundefined{Etoc@#1@@}
+ {\PackageWarning{etoc}
+ {Unknown sectioning unit #1, \protect\etocsetnextocdepth\space ignored}}
+ {\Etoc@setnexttocdepth{\csname Etoc@#1@@\endcsname}}%
+}%
+\def\Etoc@setnexttocdepth#1{%
+ \def\Etoc@tocdepthset{%
+ \Etoc@tocdepthreset
+ \edef\Etoc@tocdepthreset {%
+ \global\c@tocdepth\the\c@tocdepth\space
+ \global\let\noexpand\Etoc@tocdepthreset\noexpand\@empty
+ }%
+ \global\c@tocdepth#1%
+ \global\let\Etoc@tocdepthset\@empty
+ }%
+}%
+\let\Etoc@tocdepthreset\@empty
+\let\Etoc@tocdepthset \@empty
+\def\etocsetlocaltop #1#{\Etoc@set@localtop}%
+\def\Etoc@set@localtop #1{%
+ \@ifundefined{Etoc@#1@@}%
+ {\PackageWarning{etoc}
+ {Unknown sectioning depth #1, \protect\etocsetlocaltop.toc ignored}}%
+ {\addtocontents {toc}
+ {\protect\etoc@setlocaltop\expandafter\protect\csname Etoc@#1@@\endcsname}}%
+}%
+\def\etocimmediatesetlocaltop #1#{\Etoc@set@localtop@immediately}%
+\def\Etoc@set@localtop@immediately #1{%
+ \@ifundefined{Etoc@#1@@}%
+ {\PackageWarning{etoc}
+ {Unknown sectioning depth #1, \protect\etocimmediatesetlocaltop.toc ignored}}%
+ {\begingroup
+ \let\Etoc@originalwrite\write
+ \def\write{\immediate\Etoc@originalwrite}%
+ \addtocontents {toc}
+ {\protect\etoc@setlocaltop\expandafter\protect
+ \csname Etoc@#1@@\endcsname}%
+ \endgroup
+ }%
+}%
+\def\etoc@setlocaltop #1{%
+ \ifnum#1=\Etoc@maxlevel
+ \Etoc@skipthisonetrue
+ \else
+ \Etoc@skipthisonefalse
+ \global\let\Etoc@level #1%
+ \global\let\Etoc@virtualtop #1%
+ \ifEtoc@localtoc
+ \ifEtoc@stoptoc
+ \Etoc@skipthisonetrue
+ \else
+ \ifEtoc@notactive
+ \Etoc@skipthisonetrue
+ \else
+ \unless\ifnum\Etoc@level>\etoclocaltop
+ \Etoc@skipthisonetrue
+ \global\Etoc@stoptoctrue
+ \fi
+ \fi
+ \fi
+ \fi
+ \fi
+ \let\Etoc@next\@empty
+ \ifEtoc@skipthisone
+ \else
+ \ifnum\Etoc@level>\c@tocdepth
+ \else
+ \ifEtoc@standardlines
+ \else
+ \let\Etoc@next\Etoc@setlocaltop@doendsandbegin
+ \fi
+ \fi
+ \fi
+ \Etoc@next
+}%
+\def\Etoc@setlocaltop@doendsandbegin{%
+ \Etoc@doendsandbegin
+ \global\Etoc@skipprefixfalse
+}
+\addtocontents {toc}{\protect\@ifundefined{etoctocstyle}%
+ {\let\protect\etoc@startlocaltoc\protect\@gobble
+ \let\protect\etoc@settocdepth\protect\@gobble
+ \let\protect\etoc@depthtag\protect\@gobble
+ \let\protect\etoc@setlocaltop\protect\@gobble}{}}%
+\def\etocstandardlines {\Etoc@standardlinestrue}
+\def\etoctoclines {\Etoc@standardlinesfalse}
+\etocdefaultlines
+\etocstandardlines
+\def\etocstandarddisplaystyle{%
+ \PackageWarningNoLine{etoc}{%
+ \string\etocstandarddisplaystyle \on@line\MessageBreak
+ is deprecated. \space Please use \string\etocclasstocstyle}%
+}
+\expandafter\def\expandafter\etocclasstocstyle\expandafter{%
+ \etocclasstocstyle
+ \Etoc@classstyletrue
+}
+\def\etocetoclocaltocstyle{\Etoc@etocstyletrue}
+\def\etocusertocstyle{\Etoc@etocstylefalse}
+\etocclasstocstyle
+\etocetoclocaltocstyle
+\etocobeytoctocdepth
+\etocobeydepthtags
+\let\etocbeforetitlehook \@empty
+\let\etocaftertitlehook \@empty
+\let\etocaftercontentshook \@empty
+\let\etocaftertochook \@empty
+\def\etockeeporiginaltableofcontents
+ {\Etoc@keeporiginaltoctrue\let\tableofcontents\etocoriginaltableofcontents}%
+\endinput
+%%
+%% End of file `etoc.sty'.
diff --git a/doc/latex/files.tex b/doc/latex/files.tex
new file mode 100644
index 0000000..8ac9b20
--- /dev/null
+++ b/doc/latex/files.tex
@@ -0,0 +1,13 @@
+\doxysection{File List}
+Here is a list of all documented files with brief descriptions\+:\begin{DoxyCompactList}
+\item\contentsline{section}{src/\mbox{\hyperlink{main_8c}{main.\+c}} \\*Gem-\/graph client Main functions }{\pageref{main_8c}}{}
+\item\contentsline{section}{src/fsm/\mbox{\hyperlink{fsm_2dispatch_8c}{dispatch.\+c}} \\*
+\begin{DoxyItemize}
+\item OOOOOOOOOOO OOOOO OOO OOO \texorpdfstring{$\ast$}{*} OO OO OO OOOO OOOO \texorpdfstring{$\ast$}{*} OO OO OO OO OO OO \texorpdfstring{$\ast$}{*} OOOOOO OO OO OO OO OO \texorpdfstring{$\ast$}{*} OO OO OO OOO OO \texorpdfstring{$\ast$}{*} OO OO OO OO \texorpdfstring{$\ast$}{*} OO OO OOO OO OO \texorpdfstring{$\ast$}{*} OO OOOOOO OO OO \texorpdfstring{$\ast$}{*}
+\begin{DoxyItemize}
+\item
+\end{DoxyItemize}
+\end{DoxyItemize}}{\pageref{fsm_2dispatch_8c}}{}
+\item\contentsline{section}{src/fsm/preferences/\mbox{\hyperlink{preferences_2manager_8c}{manager.\+c}} }{\pageref{preferences_2manager_8c}}{}
+\item\contentsline{section}{src/util/draw/\mbox{\hyperlink{gl_8c}{gl.\+c}} }{\pageref{gl_8c}}{}
+\end{DoxyCompactList}
diff --git a/doc/latex/gg_calligraphie.png b/doc/latex/gg_calligraphie.png
new file mode 100644
index 0000000..f707101
Binary files /dev/null and b/doc/latex/gg_calligraphie.png differ
diff --git a/doc/latex/longtable_doxygen.sty b/doc/latex/longtable_doxygen.sty
new file mode 100644
index 0000000..e94b78b
--- /dev/null
+++ b/doc/latex/longtable_doxygen.sty
@@ -0,0 +1,456 @@
+%%
+%% This is file `longtable.sty',
+%% generated with the docstrip utility.
+%%
+%% The original source files were:
+%%
+%% longtable.dtx (with options: `package')
+%%
+%% This is a generated file.
+%%
+%% The source is maintained by the LaTeX Project team and bug
+%% reports for it can be opened at http://latex-project.org/bugs.html
+%% (but please observe conditions on bug reports sent to that address!)
+%%
+%% Copyright 1993-2016
+%% The LaTeX3 Project and any individual authors listed elsewhere
+%% in this file.
+%%
+%% This file was generated from file(s) of the Standard LaTeX `Tools Bundle'.
+%% --------------------------------------------------------------------------
+%%
+%% It may be distributed and/or modified under the
+%% conditions of the LaTeX Project Public License, either version 1.3c
+%% of this license or (at your option) any later version.
+%% The latest version of this license is in
+%% http://www.latex-project.org/lppl.txt
+%% and version 1.3c or later is part of all distributions of LaTeX
+%% version 2005/12/01 or later.
+%%
+%% This file may only be distributed together with a copy of the LaTeX
+%% `Tools Bundle'. You may however distribute the LaTeX `Tools Bundle'
+%% without such generated files.
+%%
+%% The list of all files belonging to the LaTeX `Tools Bundle' is
+%% given in the file `manifest.txt'.
+%%
+%% File: longtable.dtx Copyright (C) 1990-2001 David Carlisle
+\NeedsTeXFormat{LaTeX2e}[1995/06/01]
+\ProvidesPackage{longtable_doxygen}
+ [2014/10/28 v4.11 Multi-page Table package (DPC) - frozen version for doxygen]
+\def\LT@err{\PackageError{longtable}}
+\def\LT@warn{\PackageWarning{longtable}}
+\def\LT@final@warn{%
+ \AtEndDocument{%
+ \LT@warn{Table \@width s have changed. Rerun LaTeX.\@gobbletwo}}%
+ \global\let\LT@final@warn\relax}
+\DeclareOption{errorshow}{%
+ \def\LT@warn{\PackageInfo{longtable}}}
+\DeclareOption{pausing}{%
+ \def\LT@warn#1{%
+ \LT@err{#1}{This is not really an error}}}
+\DeclareOption{set}{}
+\DeclareOption{final}{}
+\ProcessOptions
+\newskip\LTleft \LTleft=\fill
+\newskip\LTright \LTright=\fill
+\newskip\LTpre \LTpre=\bigskipamount
+\newskip\LTpost \LTpost=\bigskipamount
+\newcount\LTchunksize \LTchunksize=20
+\let\c@LTchunksize\LTchunksize
+\newdimen\LTcapwidth \LTcapwidth=4in
+\newbox\LT@head
+\newbox\LT@firsthead
+\newbox\LT@foot
+\newbox\LT@lastfoot
+\newcount\LT@cols
+\newcount\LT@rows
+\newcounter{LT@tables}
+\newcounter{LT@chunks}[LT@tables]
+\ifx\c@table\undefined
+ \newcounter{table}
+ \def\fnum@table{\tablename~\thetable}
+\fi
+\ifx\tablename\undefined
+ \def\tablename{Table}
+\fi
+\newtoks\LT@p@ftn
+\mathchardef\LT@end@pen=30000
+\def\longtable{%
+ \par
+ \ifx\multicols\@undefined
+ \else
+ \ifnum\col@number>\@ne
+ \@twocolumntrue
+ \fi
+ \fi
+ \if@twocolumn
+ \LT@err{longtable not in 1-column mode}\@ehc
+ \fi
+ \begingroup
+ \@ifnextchar[\LT@array{\LT@array[x]}}
+\def\LT@array[#1]#2{%
+ \refstepcounter{table}\stepcounter{LT@tables}%
+ \if l#1%
+ \LTleft\z@ \LTright\fill
+ \else\if r#1%
+ \LTleft\fill \LTright\z@
+ \else\if c#1%
+ \LTleft\fill \LTright\fill
+ \fi\fi\fi
+ \let\LT@mcol\multicolumn
+ \let\LT@@tabarray\@tabarray
+ \let\LT@@hl\hline
+ \def\@tabarray{%
+ \let\hline\LT@@hl
+ \LT@@tabarray}%
+ \let\\\LT@tabularcr\let\tabularnewline\\%
+ \def\newpage{\noalign{\break}}%
+ \def\pagebreak{\noalign{\ifnum`}=0\fi\@testopt{\LT@no@pgbk-}4}%
+ \def\nopagebreak{\noalign{\ifnum`}=0\fi\@testopt\LT@no@pgbk4}%
+ \let\hline\LT@hline \let\kill\LT@kill\let\caption\LT@caption
+ \@tempdima\ht\strutbox
+ \let\@endpbox\LT@endpbox
+ \ifx\extrarowheight\@undefined
+ \let\@acol\@tabacol
+ \let\@classz\@tabclassz \let\@classiv\@tabclassiv
+ \def\@startpbox{\vtop\LT@startpbox}%
+ \let\@@startpbox\@startpbox
+ \let\@@endpbox\@endpbox
+ \let\LT@LL@FM@cr\@tabularcr
+ \else
+ \advance\@tempdima\extrarowheight
+ \col@sep\tabcolsep
+ \let\@startpbox\LT@startpbox\let\LT@LL@FM@cr\@arraycr
+ \fi
+ \setbox\@arstrutbox\hbox{\vrule
+ \@height \arraystretch \@tempdima
+ \@depth \arraystretch \dp \strutbox
+ \@width \z@}%
+ \let\@sharp##\let\protect\relax
+ \begingroup
+ \@mkpream{#2}%
+ \xdef\LT@bchunk{%
+ \global\advance\c@LT@chunks\@ne
+ \global\LT@rows\z@\setbox\z@\vbox\bgroup
+ \LT@setprevdepth
+ \tabskip\LTleft \noexpand\halign to\hsize\bgroup
+ \tabskip\z@ \@arstrut \@preamble \tabskip\LTright \cr}%
+ \endgroup
+ \expandafter\LT@nofcols\LT@bchunk&\LT@nofcols
+ \LT@make@row
+ \m@th\let\par\@empty
+ \everycr{}\lineskip\z@\baselineskip\z@
+ \LT@bchunk}
+\def\LT@no@pgbk#1[#2]{\penalty #1\@getpen{#2}\ifnum`{=0\fi}}
+\def\LT@start{%
+ \let\LT@start\endgraf
+ \endgraf\penalty\z@\vskip\LTpre
+ \dimen@\pagetotal
+ \advance\dimen@ \ht\ifvoid\LT@firsthead\LT@head\else\LT@firsthead\fi
+ \advance\dimen@ \dp\ifvoid\LT@firsthead\LT@head\else\LT@firsthead\fi
+ \advance\dimen@ \ht\LT@foot
+ \dimen@ii\vfuzz
+ \vfuzz\maxdimen
+ \setbox\tw@\copy\z@
+ \setbox\tw@\vsplit\tw@ to \ht\@arstrutbox
+ \setbox\tw@\vbox{\unvbox\tw@}%
+ \vfuzz\dimen@ii
+ \advance\dimen@ \ht
+ \ifdim\ht\@arstrutbox>\ht\tw@\@arstrutbox\else\tw@\fi
+ \advance\dimen@\dp
+ \ifdim\dp\@arstrutbox>\dp\tw@\@arstrutbox\else\tw@\fi
+ \advance\dimen@ -\pagegoal
+ \ifdim \dimen@>\z@\vfil\break\fi
+ \global\@colroom\@colht
+ \ifvoid\LT@foot\else
+ \advance\vsize-\ht\LT@foot
+ \global\advance\@colroom-\ht\LT@foot
+ \dimen@\pagegoal\advance\dimen@-\ht\LT@foot\pagegoal\dimen@
+ \maxdepth\z@
+ \fi
+ \ifvoid\LT@firsthead\copy\LT@head\else\box\LT@firsthead\fi\nobreak
+ \output{\LT@output}}
+\def\endlongtable{%
+ \crcr
+ \noalign{%
+ \let\LT@entry\LT@entry@chop
+ \xdef\LT@save@row{\LT@save@row}}%
+ \LT@echunk
+ \LT@start
+ \unvbox\z@
+ \LT@get@widths
+ \if@filesw
+ {\let\LT@entry\LT@entry@write\immediate\write\@auxout{%
+ \gdef\expandafter\noexpand
+ \csname LT@\romannumeral\c@LT@tables\endcsname
+ {\LT@save@row}}}%
+ \fi
+ \ifx\LT@save@row\LT@@save@row
+ \else
+ \LT@warn{Column \@width s have changed\MessageBreak
+ in table \thetable}%
+ \LT@final@warn
+ \fi
+ \endgraf\penalty -\LT@end@pen
+ \endgroup
+ \global\@mparbottom\z@
+ \pagegoal\vsize
+ \endgraf\penalty\z@\addvspace\LTpost
+ \ifvoid\footins\else\insert\footins{}\fi}
+\def\LT@nofcols#1&{%
+ \futurelet\@let@token\LT@n@fcols}
+\def\LT@n@fcols{%
+ \advance\LT@cols\@ne
+ \ifx\@let@token\LT@nofcols
+ \expandafter\@gobble
+ \else
+ \expandafter\LT@nofcols
+ \fi}
+\def\LT@tabularcr{%
+ \relax\iffalse{\fi\ifnum0=`}\fi
+ \@ifstar
+ {\def\crcr{\LT@crcr\noalign{\nobreak}}\let\cr\crcr
+ \LT@t@bularcr}%
+ {\LT@t@bularcr}}
+\let\LT@crcr\crcr
+\let\LT@setprevdepth\relax
+\def\LT@t@bularcr{%
+ \global\advance\LT@rows\@ne
+ \ifnum\LT@rows=\LTchunksize
+ \gdef\LT@setprevdepth{%
+ \prevdepth\z@\global
+ \global\let\LT@setprevdepth\relax}%
+ \expandafter\LT@xtabularcr
+ \else
+ \ifnum0=`{}\fi
+ \expandafter\LT@LL@FM@cr
+ \fi}
+\def\LT@xtabularcr{%
+ \@ifnextchar[\LT@argtabularcr\LT@ntabularcr}
+\def\LT@ntabularcr{%
+ \ifnum0=`{}\fi
+ \LT@echunk
+ \LT@start
+ \unvbox\z@
+ \LT@get@widths
+ \LT@bchunk}
+\def\LT@argtabularcr[#1]{%
+ \ifnum0=`{}\fi
+ \ifdim #1>\z@
+ \unskip\@xargarraycr{#1}%
+ \else
+ \@yargarraycr{#1}%
+ \fi
+ \LT@echunk
+ \LT@start
+ \unvbox\z@
+ \LT@get@widths
+ \LT@bchunk}
+\def\LT@echunk{%
+ \crcr\LT@save@row\cr\egroup
+ \global\setbox\@ne\lastbox
+ \unskip
+ \egroup}
+\def\LT@entry#1#2{%
+ \ifhmode\@firstofone{&}\fi\omit
+ \ifnum#1=\c@LT@chunks
+ \else
+ \kern#2\relax
+ \fi}
+\def\LT@entry@chop#1#2{%
+ \noexpand\LT@entry
+ {\ifnum#1>\c@LT@chunks
+ 1}{0pt%
+ \else
+ #1}{#2%
+ \fi}}
+\def\LT@entry@write{%
+ \noexpand\LT@entry^^J%
+ \@spaces}
+\def\LT@kill{%
+ \LT@echunk
+ \LT@get@widths
+ \expandafter\LT@rebox\LT@bchunk}
+\def\LT@rebox#1\bgroup{%
+ #1\bgroup
+ \unvbox\z@
+ \unskip
+ \setbox\z@\lastbox}
+\def\LT@blank@row{%
+ \xdef\LT@save@row{\expandafter\LT@build@blank
+ \romannumeral\number\LT@cols 001 }}
+\def\LT@build@blank#1{%
+ \if#1m%
+ \noexpand\LT@entry{1}{0pt}%
+ \expandafter\LT@build@blank
+ \fi}
+\def\LT@make@row{%
+ \global\expandafter\let\expandafter\LT@save@row
+ \csname LT@\romannumeral\c@LT@tables\endcsname
+ \ifx\LT@save@row\relax
+ \LT@blank@row
+ \else
+ {\let\LT@entry\or
+ \if!%
+ \ifcase\expandafter\expandafter\expandafter\LT@cols
+ \expandafter\@gobble\LT@save@row
+ \or
+ \else
+ \relax
+ \fi
+ !%
+ \else
+ \aftergroup\LT@blank@row
+ \fi}%
+ \fi}
+\let\setlongtables\relax
+\def\LT@get@widths{%
+ \setbox\tw@\hbox{%
+ \unhbox\@ne
+ \let\LT@old@row\LT@save@row
+ \global\let\LT@save@row\@empty
+ \count@\LT@cols
+ \loop
+ \unskip
+ \setbox\tw@\lastbox
+ \ifhbox\tw@
+ \LT@def@row
+ \advance\count@\m@ne
+ \repeat}%
+ \ifx\LT@@save@row\@undefined
+ \let\LT@@save@row\LT@save@row
+ \fi}
+\def\LT@def@row{%
+ \let\LT@entry\or
+ \edef\@tempa{%
+ \ifcase\expandafter\count@\LT@old@row
+ \else
+ {1}{0pt}%
+ \fi}%
+ \let\LT@entry\relax
+ \xdef\LT@save@row{%
+ \LT@entry
+ \expandafter\LT@max@sel\@tempa
+ \LT@save@row}}
+\def\LT@max@sel#1#2{%
+ {\ifdim#2=\wd\tw@
+ #1%
+ \else
+ \number\c@LT@chunks
+ \fi}%
+ {\the\wd\tw@}}
+\def\LT@hline{%
+ \noalign{\ifnum0=`}\fi
+ \penalty\@M
+ \futurelet\@let@token\LT@@hline}
+\def\LT@@hline{%
+ \ifx\@let@token\hline
+ \global\let\@gtempa\@gobble
+ \gdef\LT@sep{\penalty-\@medpenalty\vskip\doublerulesep}%
+ \else
+ \global\let\@gtempa\@empty
+ \gdef\LT@sep{\penalty-\@lowpenalty\vskip-\arrayrulewidth}%
+ \fi
+ \ifnum0=`{\fi}%
+ \multispan\LT@cols
+ \unskip\leaders\hrule\@height\arrayrulewidth\hfill\cr
+ \noalign{\LT@sep}%
+ \multispan\LT@cols
+ \unskip\leaders\hrule\@height\arrayrulewidth\hfill\cr
+ \noalign{\penalty\@M}%
+ \@gtempa}
+\def\LT@caption{%
+ \noalign\bgroup
+ \@ifnextchar[{\egroup\LT@c@ption\@firstofone}\LT@capti@n}
+\def\LT@c@ption#1[#2]#3{%
+ \LT@makecaption#1\fnum@table{#3}%
+ \def\@tempa{#2}%
+ \ifx\@tempa\@empty\else
+ {\let\\\space
+ \addcontentsline{lot}{table}{\protect\numberline{\thetable}{#2}}}%
+ \fi}
+\def\LT@capti@n{%
+ \@ifstar
+ {\egroup\LT@c@ption\@gobble[]}%
+ {\egroup\@xdblarg{\LT@c@ption\@firstofone}}}
+\def\LT@makecaption#1#2#3{%
+ \LT@mcol\LT@cols c{\hbox to\z@{\hss\parbox[t]\LTcapwidth{%
+ \sbox\@tempboxa{#1{#2: }#3}%
+ \ifdim\wd\@tempboxa>\hsize
+ #1{#2: }#3%
+ \else
+ \hbox to\hsize{\hfil\box\@tempboxa\hfil}%
+ \fi
+ \endgraf\vskip\baselineskip}%
+ \hss}}}
+\def\LT@output{%
+ \ifnum\outputpenalty <-\@Mi
+ \ifnum\outputpenalty > -\LT@end@pen
+ \LT@err{floats and marginpars not allowed in a longtable}\@ehc
+ \else
+ \setbox\z@\vbox{\unvbox\@cclv}%
+ \ifdim \ht\LT@lastfoot>\ht\LT@foot
+ \dimen@\pagegoal
+ \advance\dimen@-\ht\LT@lastfoot
+ \ifdim\dimen@<\ht\z@
+ \setbox\@cclv\vbox{\unvbox\z@\copy\LT@foot\vss}%
+ \@makecol
+ \@outputpage
+ \setbox\z@\vbox{\box\LT@head}%
+ \fi
+ \fi
+ \global\@colroom\@colht
+ \global\vsize\@colht
+ \vbox
+ {\unvbox\z@\box\ifvoid\LT@lastfoot\LT@foot\else\LT@lastfoot\fi}%
+ \fi
+ \else
+ \setbox\@cclv\vbox{\unvbox\@cclv\copy\LT@foot\vss}%
+ \@makecol
+ \@outputpage
+ \global\vsize\@colroom
+ \copy\LT@head\nobreak
+ \fi}
+\def\LT@end@hd@ft#1{%
+ \LT@echunk
+ \ifx\LT@start\endgraf
+ \LT@err
+ {Longtable head or foot not at start of table}%
+ {Increase LTchunksize}%
+ \fi
+ \setbox#1\box\z@
+ \LT@get@widths
+ \LT@bchunk}
+\def\endfirsthead{\LT@end@hd@ft\LT@firsthead}
+\def\endhead{\LT@end@hd@ft\LT@head}
+\def\endfoot{\LT@end@hd@ft\LT@foot}
+\def\endlastfoot{\LT@end@hd@ft\LT@lastfoot}
+\def\LT@startpbox#1{%
+ \bgroup
+ \let\@footnotetext\LT@p@ftntext
+ \setlength\hsize{#1}%
+ \@arrayparboxrestore
+ \vrule \@height \ht\@arstrutbox \@width \z@}
+\def\LT@endpbox{%
+ \@finalstrut\@arstrutbox
+ \egroup
+ \the\LT@p@ftn
+ \global\LT@p@ftn{}%
+ \hfil}
+%% added \long to prevent:
+% LaTeX Warning: Command \LT@p@ftntext has changed.
+%
+% from the original repository (https://github.com/latex3/latex2e/blob/develop/required/tools/longtable.dtx):
+% \changes{v4.15}{2021/03/28}
+% {make long for gh/364}
+% Inside the `p' column, just save up the footnote text in a token
+% register.
+\long\def\LT@p@ftntext#1{%
+ \edef\@tempa{\the\LT@p@ftn\noexpand\footnotetext[\the\c@footnote]}%
+ \global\LT@p@ftn\expandafter{\@tempa{#1}}}%
+
+\@namedef{ver@longtable.sty}{2014/10/28 v4.11 Multi-page Table package (DPC) - frozen version for doxygen}
+\endinput
+%%
+%% End of file `longtable.sty'.
diff --git a/doc/latex/refman.tex b/doc/latex/refman.tex
new file mode 100644
index 0000000..6415b26
--- /dev/null
+++ b/doc/latex/refman.tex
@@ -0,0 +1,244 @@
+ % Handle batch mode
+ % to overcome problems with too many open files
+ \let\mypdfximage\pdfximage\def\pdfximage{\immediate\mypdfximage}
+ \pdfminorversion=7
+ % Set document class depending on configuration
+ \documentclass[twoside]{book}
+ %% moved from doxygen.sty due to workaround for LaTex 2019 version and unmaintained tabu package
+ \usepackage{ifthen}
+ \ifx\requestedLaTeXdate\undefined
+ \usepackage{array}
+ \else
+ \usepackage{array}[=2016-10-06]
+ \fi
+ %%
+ % Packages required by doxygen
+ \makeatletter
+ \providecommand\IfFormatAtLeastTF{\@ifl@t@r\fmtversion}
+ % suppress package identification of infwarerr as it contains the word "warning"
+ \let\@@protected@wlog\protected@wlog
+ \def\protected@wlog#1{\wlog{package info suppressed}}
+ \RequirePackage{infwarerr}
+ \let\protected@wlog\@@protected@wlog
+ \makeatother
+ \IfFormatAtLeastTF{2016/01/01}{}{\usepackage{fixltx2e}} % for \textsubscript
+ \IfFormatAtLeastTF{2015/01/01}{\pdfsuppresswarningpagegroup=1}{}
+ \usepackage{doxygen}
+ \usepackage{graphicx}
+ \usepackage[utf8]{inputenc}
+ \usepackage{makeidx}
+ \PassOptionsToPackage{warn}{textcomp}
+ \usepackage{textcomp}
+ \usepackage[nointegrals]{wasysym}
+ \usepackage{ifxetex}
+ % NLS support packages
+ % Define default fonts
+ % Font selection
+ \usepackage[T1]{fontenc}
+ % set main and monospaced font
+ \usepackage[scaled=.90]{helvet}
+\usepackage{courier}
+\renewcommand{\familydefault}{\sfdefault}
+ \doxyallsectionsfont{%
+ \fontseries{bc}\selectfont%
+ \color{darkgray}%
+ }
+ \renewcommand{\DoxyLabelFont}{%
+ \fontseries{bc}\selectfont%
+ \color{darkgray}%
+ }
+ \newcommand{\+}{\discretionary{\mbox{\scriptsize$\hookleftarrow$}}{}{}}
+ % Arguments of doxygenemoji:
+ % 1) '::' form of the emoji, already LaTeX-escaped
+ % 2) file with the name of the emoji without the .png extension
+ % in case image exist use this otherwise use the '::' form
+ \newcommand{\doxygenemoji}[2]{%
+ \IfFileExists{./#2.png}{\raisebox{-0.1em}{\includegraphics[height=0.9em]{./#2.png}}}{#1}%
+ }
+ % Page & text layout
+ \usepackage{geometry}
+ \geometry{%
+ a4paper,%
+ top=2.5cm,%
+ bottom=2.5cm,%
+ left=2.5cm,%
+ right=2.5cm%
+ }
+ \usepackage{changepage}
+ % Allow a bit of overflow to go unnoticed by other means
+ \tolerance=750
+ \hfuzz=15pt
+ \hbadness=750
+ \setlength{\emergencystretch}{15pt}
+ \setlength{\parindent}{0cm}
+ \newcommand{\doxynormalparskip}{\setlength{\parskip}{3ex plus 2ex minus 2ex}}
+ \newcommand{\doxytocparskip}{\setlength{\parskip}{1ex plus 0ex minus 0ex}}
+ \doxynormalparskip
+ % Redefine paragraph/subparagraph environments, using sectsty fonts
+ \makeatletter
+ \renewcommand{\paragraph}{%
+ \@startsection{paragraph}{4}{0ex}{-1.0ex}{1.0ex}{%
+ \normalfont\normalsize\bfseries\SS@parafont%
+ }%
+ }
+ \renewcommand{\subparagraph}{%
+ \@startsection{subparagraph}{5}{0ex}{-1.0ex}{1.0ex}{%
+ \normalfont\normalsize\bfseries\SS@subparafont%
+ }%
+ }
+ \makeatother
+ \makeatletter
+ \newcommand\hrulefilll{\leavevmode\leaders\hrule\hskip 0pt plus 1filll\kern\z@}
+ \makeatother
+ % Headers & footers
+ \usepackage{fancyhdr}
+ \pagestyle{fancyplain}
+ \renewcommand{\footrulewidth}{0.4pt}
+ \fancypagestyle{fancyplain}{
+ \fancyhf{}
+ \fancyhead[LE, RO]{\bfseries\thepage}
+ \fancyhead[LO]{\bfseries\rightmark}
+ \fancyhead[RE]{\bfseries\leftmark}
+ \fancyfoot[LO, RE]{\bfseries\scriptsize Generated by Doxygen }
+ }
+ \fancypagestyle{plain}{
+ \fancyhf{}
+ \fancyfoot[LO, RE]{\bfseries\scriptsize Generated by Doxygen }
+ \renewcommand{\headrulewidth}{0pt}
+ }
+ \pagestyle{fancyplain}
+ \renewcommand{\chaptermark}[1]{%
+ \markboth{#1}{}%
+ }
+ \renewcommand{\sectionmark}[1]{%
+ \markright{\thesection\ #1}%
+ }
+ % ToC, LoF, LoT, bibliography, and index
+ % Indices & bibliography
+ \usepackage{natbib}
+ \usepackage[titles]{tocloft}
+ \setcounter{tocdepth}{3}
+ \setcounter{secnumdepth}{5}
+ % creating indexes
+ \makeindex
+ \usepackage{newunicodechar}
+ \makeatletter
+ \def\doxynewunicodechar#1#2{%
+ \@tempswafalse
+ \edef\nuc@tempa{\detokenize{#1}}%
+ \if\relax\nuc@tempa\relax
+ \nuc@emptyargerr
+ \else
+ \edef\@tempb{\expandafter\@car\nuc@tempa\@nil}%
+ \nuc@check
+ \if@tempswa
+ \@namedef{u8:\nuc@tempa}{#2}%
+ \fi
+ \fi
+ }
+ \makeatother
+ \doxynewunicodechar{⁻}{${}^{-}$}% Superscript minus
+ \doxynewunicodechar{²}{${}^{2}$}% Superscript two
+ \doxynewunicodechar{³}{${}^{3}$}% Superscript three
+ % Hyperlinks
+ % Hyperlinks (required, but should be loaded last)
+ \ifpdf
+ \usepackage[pdftex,pagebackref=true]{hyperref}
+ \else
+ \ifxetex
+ \usepackage[pagebackref=true]{hyperref}
+ \else
+ \usepackage[ps2pdf,pagebackref=true]{hyperref}
+ \fi
+ \fi
+ \hypersetup{%
+ colorlinks=true,%
+ linkcolor=blue,%
+ citecolor=blue,%
+ unicode,%
+ pdftitle={Gem-\/graph},%
+ pdfsubject={A modelling tool based on rewriting of geometric graphs.}%
+ }
+ % Custom commands used by the header
+ % Custom commands
+ \newcommand{\clearemptydoublepage}{%
+ \newpage{\pagestyle{empty}\cleardoublepage}%
+ }
+ % caption style definition
+ \usepackage{caption}
+ \captionsetup{labelsep=space,justification=centering,font={bf},singlelinecheck=off,skip=4pt,position=top}
+ % in page table of contents
+ \IfFormatAtLeastTF{2023/05/01}{\usepackage[deeplevels]{etoc}}{\usepackage[deeplevels]{etoc_doxygen}}
+ \etocsettocstyle{\doxytocparskip}{\doxynormalparskip}
+ \etocsetlevel{subsubsubsection}{4}
+ \etocsetlevel{subsubsubsubsection}{5}
+ \etocsetlevel{subsubsubsubsubsection}{6}
+ \etocsetlevel{subsubsubsubsubsubsection}{7}
+ \etocsetlevel{paragraph}{8}
+ \etocsetlevel{subparagraph}{9}
+ % prevent numbers overlap the titles in toc
+ \renewcommand{\numberline}[1]{#1~}
+% End of preamble, now comes the document contents
+%===== C O N T E N T S =====
+\begin{document}
+ \raggedbottom
+ % Titlepage & ToC
+ % To avoid duplicate page anchors due to reuse of same numbers for
+ % the index (be it as roman numbers)
+ \hypersetup{pageanchor=false,
+ bookmarksnumbered=true,
+ pdfencoding=unicode
+ }
+ \pagenumbering{alph}
+ \begin{titlepage}
+ \vspace*{7cm}
+ \begin{center}%
+ {\Large Gem-\/graph}\\
+ [1ex]\large 0.\+1.\+0 \\
+ \vspace*{1cm}
+ {\large Generated by Doxygen 1.9.8}\\
+ \end{center}
+ \end{titlepage}
+ \clearemptydoublepage
+ \pagenumbering{roman}
+ \tableofcontents
+ \clearemptydoublepage
+ \pagenumbering{arabic}
+ % re-enable anchors again
+ \hypersetup{pageanchor=true}
+%--- Begin generated contents ---
+\chapter{Class Index}
+\input{annotated}
+\chapter{File Index}
+\input{files}
+\chapter{Class Documentation}
+\input{d3/d03/structarrow__t}
+\input{d1/d04/structdblist}
+\input{d0/d0b/structelem}
+\input{d9/d03/structfsm__struct__journal}
+\input{d7/d08/structfsm__struct__journal__unit}
+\input{d9/d04/structfsm__struct__list__data}
+\input{d1/d07/structfsm__struct__list__disp}
+\input{d5/d00/structfsm__struct__list__tool}
+\input{dd/d0e/structgraphics__stack__t}
+\input{da/d03/structpile}
+\input{d3/d0f/structpreferences}
+\input{df/d05/structslist}
+\input{d7/d07/structStack}
+\input{d7/d02/structstack__index__t}
+\input{d1/d09/structTreeNode__t}
+\chapter{File Documentation}
+\input{d9/d06/preferences_2manager_8c}
+\input{d0/d09/main_8c}
+\input{da/d0c/gl_8c}
+\input{d4/d07/fsm_2dispatch_8c}
+%--- End generated contents ---
+% Index
+ \backmatter
+ \newpage
+ \phantomsection
+ \clearemptydoublepage
+ \addcontentsline{toc}{chapter}{\indexname}
+ \printindex
+% Required for some languages (in combination with latexdocumentpre from the header)
+\end{document}
diff --git a/doc/latex/tabu_doxygen.sty b/doc/latex/tabu_doxygen.sty
new file mode 100644
index 0000000..3f17d1d
--- /dev/null
+++ b/doc/latex/tabu_doxygen.sty
@@ -0,0 +1,2557 @@
+%%
+%% This is file `tabu.sty',
+%% generated with the docstrip utility.
+%%
+%% The original source files were:
+%%
+%% tabu.dtx (with options: `package')
+%%
+%% This is a generated file.
+%% Copyright (FC) 2010-2011 - lppl
+%%
+%% tabu : 2011/02/26 v2.8 - tabu : Flexible LaTeX tabulars
+%%
+%% **********************************************************************************************
+%% \begin{tabu} { preamble } => default target: \linewidth or \linegoal
+%% \begin{tabu} to { preamble } => target specified
+%% \begin{tabu} spread { preamble } => target relative to the ``natural width''
+%%
+%% tabu works in text and in math modes.
+%%
+%% X columns: automatic width adjustment + horizontal and vertical alignment
+%% \begin{tabu} { X[4c] X[1c] X[-2ml] }
+%%
+%% Horizontal lines and / or leaders:
+%% \hline\hline => double horizontal line
+%% \firsthline\hline => for nested tabulars
+%% \lasthline\hline => for nested tabulars
+%% \tabucline[line spec]{column-column} => ``funny'' lines (dash/leader)
+%% Automatic lines / leaders :
+%% \everyrow{\hline\hline}
+%%
+%% Vertical lines and / or leaders:
+%% \begin{tabu} { |[3pt red] X[4c] X[1c] X[-2ml] |[3pt blue] }
+%% \begin{tabu} { |[3pt red] X[4c] X[1c] X[-2ml] |[3pt on 2pt off 4pt blue] }
+%%
+%% Fixed vertical spacing adjustment:
+%% \extrarowheight= \extrarowdepth=
+%% or: \extrarowsep= => may be prefixed by \global
+%%
+%% Dynamic vertical spacing adjustment:
+%% \abovetabulinesep= \belowtabulinesep=
+%% or: \tabulinesep= => may be prefixed by \global
+%%
+%% delarray.sty shortcuts: in math and text modes
+%% \begin{tabu} .... \({ preamble }\)
+%%
+%% Algorithms reports:
+%% \tracingtabu=1 \tracingtabu=2
+%%
+%% **********************************************************************************************
+%%
+%% This work may be distributed and/or modified under the
+%% conditions of the LaTeX Project Public License, either
+%% version 1.3 of this license or (at your option) any later
+%% version. The latest version of this license is in
+%% http://www.latex-project.org/lppl.txt
+%%
+%% This work consists of the main source file tabu.dtx
+%% and the derived files
+%% tabu.sty, tabu.pdf, tabu.ins
+%%
+%% tabu : Flexible LaTeX tabulars
+%% lppl copyright 2010-2011 by FC
+%%
+
+\NeedsTeXFormat{LaTeX2e}[2005/12/01]
+\ProvidesPackage{tabu_doxygen}[2011/02/26 v2.8 - flexible LaTeX tabulars (FC), frozen version for doxygen]
+\RequirePackage{array}[2008/09/09]
+\RequirePackage{varwidth}[2009/03/30]
+\AtEndOfPackage{\tabu@AtEnd \let\tabu@AtEnd \@undefined}
+\let\tabu@AtEnd\@empty
+\def\TMP@EnsureCode#1={%
+ \edef\tabu@AtEnd{\tabu@AtEnd
+ \catcode#1 \the\catcode#1}%
+ \catcode#1=%
+}% \TMP@EnsureCode
+\TMP@EnsureCode 33 = 12 % !
+\TMP@EnsureCode 58 = 12 % : (for siunitx)
+\TMP@EnsureCode124 = 12 % |
+\TMP@EnsureCode 36 = 3 % $ = math shift
+\TMP@EnsureCode 38 = 4 % & = tab alignment character
+\TMP@EnsureCode 32 = 10 % space
+\TMP@EnsureCode 94 = 7 % ^
+\TMP@EnsureCode 95 = 8 % _
+%% Constants --------------------------------------------------------
+\newcount \c@taburow \def\thetaburow {\number\c@taburow}
+\newcount \tabu@nbcols
+\newcount \tabu@cnt
+\newcount \tabu@Xcol
+\let\tabu@start \@tempcnta
+\let\tabu@stop \@tempcntb
+\newcount \tabu@alloc \tabu@alloc=\m@ne
+\newcount \tabu@nested
+\def\tabu@alloc@{\global\advance\tabu@alloc \@ne \tabu@nested\tabu@alloc}
+\newdimen \tabu@target
+\newdimen \tabu@spreadtarget
+\newdimen \tabu@naturalX
+\newdimen \tabucolX
+\let\tabu@DELTA \@tempdimc
+\let\tabu@thick \@tempdima
+\let\tabu@on \@tempdimb
+\let\tabu@off \@tempdimc
+\newdimen \tabu@Xsum
+\newdimen \extrarowdepth
+\newdimen \abovetabulinesep
+\newdimen \belowtabulinesep
+\newdimen \tabustrutrule \tabustrutrule \z@
+\newtoks \tabu@thebody
+\newtoks \tabu@footnotes
+\newsavebox \tabu@box
+\newsavebox \tabu@arstrutbox
+\newsavebox \tabu@hleads
+\newsavebox \tabu@vleads
+\newif \iftabu@colortbl
+\newif \iftabu@siunitx
+\newif \iftabu@measuring
+\newif \iftabu@spread
+\newif \iftabu@negcoef
+\newif \iftabu@everyrow
+\def\tabu@everyrowtrue {\global\let\iftabu@everyrow \iftrue}
+\def\tabu@everyrowfalse{\global\let\iftabu@everyrow \iffalse}
+\newif \iftabu@long
+\newif \iftabuscantokens
+\def\tabu@rescan {\tabu@verbatim \scantokens }
+%% Utilities (for internal usage) -----------------------------------
+\def\tabu@gobblespace #1 {#1}
+\def\tabu@gobbletoken #1#2{#1}
+\def\tabu@gobbleX{\futurelet\@let@token \tabu@gobblex}
+\def\tabu@gobblex{\if ^^J\noexpand\@let@token \expandafter\@gobble
+ \else\ifx \@sptoken\@let@token
+ \expandafter\tabu@gobblespace\expandafter\tabu@gobbleX
+ \fi\fi
+}% \tabu@gobblex
+\def\tabu@X{^^J}
+{\obeyspaces
+\global\let\tabu@spxiii= % saves an active space (for \ifx)
+\gdef\tabu@@spxiii{ }}
+\def\tabu@ifenvir {% only for \multicolumn
+ \expandafter\tabu@if@nvir\csname\@currenvir\endcsname
+}% \tabu@ifenvir
+\def\tabu@if@nvir #1{\csname @\ifx\tabu#1first\else
+ \ifx\longtabu#1first\else
+ second\fi\fi oftwo\endcsname
+}% \tabu@ifenvir
+\def\tabu@modulo #1#2{\numexpr\ifnum\numexpr#1=\z@ 0\else #1-(#1-(#2-1)/2)/(#2)*(#2)\fi}
+{\catcode`\&=3
+\gdef\tabu@strtrim #1{% #1 = control sequence to trim
+ \ifodd 1\ifx #1\@empty \else \ifx #1\space \else 0\fi \fi
+ \let\tabu@c@l@r \@empty \let#1\@empty
+ \else \expandafter \tabu@trimspaces #1\@nnil
+ \fi
+}% \tabu@strtrim
+\gdef\tabu@trimspaces #1\@nnil{\let\tabu@c@l@r=#2\tabu@firstspace .#1& }%
+\gdef\tabu@firstspace #1#2#3 &{\tabu@lastspace #2#3&}
+\gdef\tabu@lastspace #1{\def #3{#1}%
+ \ifx #3\tabu@c@l@r \def\tabu@c@l@r{\protect\color{#1}}\expandafter\remove@to@nnil \fi
+ \tabu@trimspaces #1\@nnil}
+}% \catcode
+\def\tabu@sanitizearg #1#2{{%
+ \csname \ifcsname if@safe@actives\endcsname %
+ @safe@activestrue\else
+ relax\fi \endcsname
+ \edef#2{#1}\tabu@strtrim#2\@onelevel@sanitize#2%
+ \expandafter}\expandafter\def\expandafter#2\expandafter{#2}%
+}% \tabu@sanitizearg
+\def\tabu@textbar #1{\begingroup \endlinechar\m@ne \scantokens{\def\:{|}}%
+ \expandafter\endgroup \expandafter#1\:% !!! semi simple group !!!
+}% \tabu@textbar
+\def\tabu@everyrow@bgroup{\iftabu@everyrow \begingroup \else \noalign{\ifnum0=`}\fi \fi}
+\def\tabu@everyrow@egroup{%
+ \iftabu@everyrow \expandafter \endgroup \the\toks@
+ \else \ifnum0=`{\fi}%
+ \fi
+}% \tabu@everyrow@egroup
+\def\tabu@arstrut {\global\setbox\@arstrutbox \hbox{\vrule
+ height \arraystretch \dimexpr\ht\strutbox+\extrarowheight
+ depth \arraystretch \dimexpr\dp\strutbox+\extrarowdepth
+ width \z@}%
+}% \tabu@arstrut
+\def\tabu@rearstrut {%
+ \@tempdima \arraystretch\dimexpr\ht\strutbox+\extrarowheight \relax
+ \@tempdimb \arraystretch\dimexpr\dp\strutbox+\extrarowdepth \relax
+ \ifodd 1\ifdim \ht\@arstrutbox=\@tempdima
+ \ifdim \dp\@arstrutbox=\@tempdimb 0 \fi\fi
+ \tabu@mkarstrut
+ \fi
+}% \tabu@rearstrut
+\def\tabu@@DBG #1{\ifdim\tabustrutrule>\z@ \color{#1}\fi}
+\def\tabu@DBG@arstrut {\global\setbox\@arstrutbox
+ \hbox to\z@{\hbox to\z@{\hss
+ {\tabu@DBG{cyan}\vrule
+ height \arraystretch \dimexpr\ht\strutbox+\extrarowheight
+ depth \z@
+ width \tabustrutrule}\kern-\tabustrutrule
+ {\tabu@DBG{pink}\vrule
+ height \z@
+ depth \arraystretch \dimexpr\dp\strutbox+\extrarowdepth
+ width \tabustrutrule}}}%
+}% \tabu@DBG@arstrut
+\def\tabu@save@decl{\toks\count@ \expandafter{\the\toks\expandafter\count@
+ \@nextchar}}%
+\def\tabu@savedecl{\ifcat$\d@llarend\else
+ \let\save@decl \tabu@save@decl \fi % no inversion of tokens in text mode
+}% \tabu@savedecl
+\def\tabu@finalstrut #1{\unskip\ifhmode\nobreak\fi\vrule height\z@ depth\z@ width\z@}
+\newcommand*\tabuDisableCommands {\g@addto@macro\tabu@trialh@@k }
+\let\tabu@trialh@@k \@empty
+\def\tabu@nowrite #1#{{\afterassignment}\toks@}
+\let\tabu@write\write
+\let\tabu@immediate\immediate
+\def\tabu@WRITE{\begingroup
+ \def\immediate\write{\aftergroup\endgroup
+ \tabu@immediate\tabu@write}%
+}% \tabu@WRITE
+\expandafter\def\expandafter\tabu@GenericError\expandafter{%
+ \expandafter\tabu@WRITE\GenericError}
+\def\tabu@warn{\tabu@WRITE\PackageWarning{tabu}}
+\def\tabu@noxfootnote [#1]{\@gobble}
+\def\tabu@nocolor #1#{\@gobble}
+\newcommand*\tabu@norowcolor[2][]{}
+\def\tabu@maybesiunitx #1{\def\tabu@temp{#1}%
+ \futurelet\@let@token \tabu@m@ybesiunitx}
+\def\tabu@m@ybesiunitx #1{\def\tabu@m@ybesiunitx {%
+ \ifx #1\@let@token \let\tabu@cellleft \@empty \let\tabu@cellright \@empty \fi
+ \tabu@temp}% \tabu@m@ybesiunitx
+}\expandafter\tabu@m@ybesiunitx \csname siunitx_table_collect_begin:Nn\endcsname
+\def\tabu@celllalign@def #1{\def\tabu@celllalign{\tabu@maybesiunitx{#1}}}%
+%% Fixed vertical spacing adjustment: \extrarowsep ------------------
+\newcommand*\extrarowsep{\edef\tabu@C@extra{\the\numexpr\tabu@C@extra+1}%
+ \iftabu@everyrow \aftergroup\tabu@Gextra
+ \else \aftergroup\tabu@n@Gextra
+ \fi
+ \@ifnextchar={\tabu@gobbletoken\tabu@extra} \tabu@extra
+}% \extrarowsep
+\def\tabu@extra {\@ifnextchar_%
+ {\tabu@gobbletoken{\tabu@setextra\extrarowheight \extrarowdepth}}
+ {\ifx ^\@let@token \def\tabu@temp{%
+ \tabu@gobbletoken{\tabu@setextra\extrarowdepth \extrarowheight}}%
+ \else \let\tabu@temp \@empty
+ \afterassignment \tabu@setextrasep \extrarowdepth
+ \fi \tabu@temp}%
+}% \tabu@extra
+\def\tabu@setextra #1#2{\def\tabu@temp{\tabu@extr@#1#2}\afterassignment\tabu@temp#2}
+\def\tabu@extr@ #1#2{\@ifnextchar^%
+ {\tabu@gobbletoken{\tabu@setextra\extrarowdepth \extrarowheight}}
+ {\ifx _\@let@token \def\tabu@temp{%
+ \tabu@gobbletoken{\tabu@setextra\extrarowheight \extrarowdepth}}%
+ \else \let\tabu@temp \@empty
+ \tabu@Gsave \tabu@G@extra \tabu@C@extra \extrarowheight \extrarowdepth
+ \fi \tabu@temp}%
+}% \tabu@extr@
+\def\tabu@setextrasep {\extrarowheight=\extrarowdepth
+ \tabu@Gsave \tabu@G@extra \tabu@C@extra \extrarowheight \extrarowdepth
+}% \tabu@setextrasep
+\def\tabu@Gextra{\ifx \tabu@G@extra\@empty \else {\tabu@Rextra}\fi}
+\def\tabu@n@Gextra{\ifx \tabu@G@extra\@empty \else \noalign{\tabu@Rextra}\fi}
+\def\tabu@Rextra{\tabu@Grestore \tabu@G@extra \tabu@C@extra}
+\let\tabu@C@extra \z@
+\let\tabu@G@extra \@empty
+%% Dynamic vertical spacing adjustment: \tabulinesep ----------------
+\newcommand*\tabulinesep{\edef\tabu@C@linesep{\the\numexpr\tabu@C@linesep+1}%
+ \iftabu@everyrow \aftergroup\tabu@Glinesep
+ \else \aftergroup\tabu@n@Glinesep
+ \fi
+ \@ifnextchar={\tabu@gobbletoken\tabu@linesep} \tabu@linesep
+}% \tabulinesep
+\def\tabu@linesep {\@ifnextchar_%
+ {\tabu@gobbletoken{\tabu@setsep\abovetabulinesep \belowtabulinesep}}
+ {\ifx ^\@let@token \def\tabu@temp{%
+ \tabu@gobbletoken{\tabu@setsep\belowtabulinesep \abovetabulinesep}}%
+ \else \let\tabu@temp \@empty
+ \afterassignment \tabu@setlinesep \abovetabulinesep
+ \fi \tabu@temp}%
+}% \tabu@linesep
+\def\tabu@setsep #1#2{\def\tabu@temp{\tabu@sets@p#1#2}\afterassignment\tabu@temp#2}
+\def\tabu@sets@p #1#2{\@ifnextchar^%
+ {\tabu@gobbletoken{\tabu@setsep\belowtabulinesep \abovetabulinesep}}
+ {\ifx _\@let@token \def\tabu@temp{%
+ \tabu@gobbletoken{\tabu@setsep\abovetabulinesep \belowtabulinesep}}%
+ \else \let\tabu@temp \@empty
+ \tabu@Gsave \tabu@G@linesep \tabu@C@linesep \abovetabulinesep \belowtabulinesep
+ \fi \tabu@temp}%
+}% \tabu@sets@p
+\def\tabu@setlinesep {\belowtabulinesep=\abovetabulinesep
+ \tabu@Gsave \tabu@G@linesep \tabu@C@linesep \abovetabulinesep \belowtabulinesep
+}% \tabu@setlinesep
+\def\tabu@Glinesep{\ifx \tabu@G@linesep\@empty \else {\tabu@Rlinesep}\fi}
+\def\tabu@n@Glinesep{\ifx \tabu@G@linesep\@empty \else \noalign{\tabu@Rlinesep}\fi}
+\def\tabu@Rlinesep{\tabu@Grestore \tabu@G@linesep \tabu@C@linesep}
+\let\tabu@C@linesep \z@
+\let\tabu@G@linesep \@empty
+%% \global\extrarowsep and \global\tabulinesep -------------------
+\def\tabu@Gsave #1#2#3#4{\xdef#1{#1%
+ \toks#2{\toks\the\currentgrouplevel{\global#3\the#3\global#4\the#4}}}%
+}% \tabu@Gsave
+\def\tabu@Grestore#1#2{%
+ \toks#2{}#1\toks\currentgrouplevel\expandafter{\expandafter}\the\toks#2\relax
+ \ifcat$\the\toks\currentgrouplevel$\else
+ \global\let#1\@empty \global\let#2\z@
+ \the\toks\currentgrouplevel
+ \fi
+}% \tabu@Grestore
+%% Setting code for every row ---------------------------------------
+\newcommand*\everyrow{\tabu@everyrow@bgroup
+ \tabu@start \z@ \tabu@stop \z@ \tabu@evrstartstop
+}% \everyrow
+\def\tabu@evrstartstop {\@ifnextchar^%
+ {\afterassignment \tabu@evrstartstop \tabu@stop=}%
+ {\ifx ^\@let@token
+ \afterassignment\tabu@evrstartstop \tabu@start=%
+ \else \afterassignment\tabu@everyr@w \toks@
+ \fi}%
+}% \tabu@evrstartstop
+\def\tabu@everyr@w {%
+ \xdef\tabu@everyrow{%
+ \noexpand\tabu@everyrowfalse
+ \let\noalign \relax
+ \noexpand\tabu@rowfontreset
+ \iftabu@colortbl \noexpand\tabu@rc@ \fi % \taburowcolors
+ \let\noexpand\tabu@docline \noexpand\tabu@docline@evr
+ \the\toks@
+ \noexpand\tabu@evrh@@k
+ \noexpand\tabu@rearstrut
+ \global\advance\c@taburow \@ne}%
+ \iftabu@everyrow \toks@\expandafter
+ {\expandafter\def\expandafter\tabu@evr@L\expandafter{\the\toks@}\ignorespaces}%
+ \else \xdef\tabu@evr@G{\the\toks@}%
+ \fi
+ \tabu@everyrow@egroup
+}% \tabu@everyr@w
+\def\tabu@evr {\def\tabu@evrh@@k} % for internal use only
+\tabu@evr{}
+%% line style and leaders -------------------------------------------
+\newcommand*\newtabulinestyle [1]{%
+ {\@for \@tempa :=#1\do{\expandafter\tabu@newlinestyle \@tempa==\@nil}}%
+}% \newtabulinestyle
+\def\tabu@newlinestyle #1=#2=#3\@nil{\tabu@getline {#2}%
+ \tabu@sanitizearg {#1}\@tempa
+ \ifodd 1\ifx \@tempa\@empty \ifdefined\tabu@linestyle@ 0 \fi\fi
+ \global\expandafter\let
+ \csname tabu@linestyle@\@tempa \endcsname =\tabu@thestyle \fi
+}% \tabu@newlinestyle
+\newcommand*\tabulinestyle [1]{\tabu@everyrow@bgroup \tabu@getline{#1}%
+ \iftabu@everyrow
+ \toks@\expandafter{\expandafter \def \expandafter
+ \tabu@ls@L\expandafter{\tabu@thestyle}\ignorespaces}%
+ \gdef\tabu@ls@{\tabu@ls@L}%
+ \else
+ \global\let\tabu@ls@G \tabu@thestyle
+ \gdef\tabu@ls@{\tabu@ls@G}%
+ \fi
+ \tabu@everyrow@egroup
+}% \tabulinestyle
+\newcommand*\taburulecolor{\tabu@everyrow@bgroup \tabu@textbar \tabu@rulecolor}
+\def\tabu@rulecolor #1{\toks@{}%
+ \def\tabu@temp #1##1#1{\tabu@ruledrsc{##1}}\@ifnextchar #1%
+ \tabu@temp
+ \tabu@rulearc
+}% \tabu@rulecolor
+\def\tabu@ruledrsc #1{\edef\tabu@temp{#1}\tabu@strtrim\tabu@temp
+ \ifx \tabu@temp\@empty \def\tabu@temp{\tabu@rule@drsc@ {}{}}%
+ \else \edef\tabu@temp{\noexpand\tabu@rule@drsc@ {}{\tabu@temp}}%
+ \fi
+ \tabu@temp
+}% \tabu@ruledrsc@
+\def\tabu@ruledrsc@ #1#{\tabu@rule@drsc@ {#1}}
+\def\tabu@rule@drsc@ #1#2{%
+ \iftabu@everyrow
+ \ifx \\#1#2\\\toks@{\let\CT@drsc@ \relax}%
+ \else \toks@{\def\CT@drsc@{\color #1{#2}}}%
+ \fi
+ \else
+ \ifx \\#1#2\\\global\let\CT@drsc@ \relax
+ \else \gdef\CT@drsc@{\color #1{#2}}%
+ \fi
+ \fi
+ \tabu@rulearc
+}% \tabu@rule@drsc@
+\def\tabu@rulearc #1#{\tabu@rule@arc@ {#1}}
+\def\tabu@rule@arc@ #1#2{%
+ \iftabu@everyrow
+ \ifx \\#1#2\\\toks@\expandafter{\the\toks@ \def\CT@arc@{}}%
+ \else \toks@\expandafter{\the\toks@ \def\CT@arc@{\color #1{#2}}}%
+ \fi
+ \toks@\expandafter{\the\toks@
+ \let\tabu@arc@L \CT@arc@
+ \let\tabu@drsc@L \CT@drsc@
+ \ignorespaces}%
+ \else
+ \ifx \\#1#2\\\gdef\CT@arc@{}%
+ \else \gdef\CT@arc@{\color #1{#2}}%
+ \fi
+ \global\let\tabu@arc@G \CT@arc@
+ \global\let\tabu@drsc@G \CT@drsc@
+ \fi
+ \tabu@everyrow@egroup
+}% \tabu@rule@arc@
+\def\taburowcolors {\tabu@everyrow@bgroup \@testopt \tabu@rowcolors 1}
+\def\tabu@rowcolors [#1]#2#{\tabu@rowc@lors{#1}{#2}}
+\def\tabu@rowc@lors #1#2#3{%
+ \toks@{}\@defaultunits \count@ =\number0#2\relax \@nnil
+ \@defaultunits \tabu@start =\number0#1\relax \@nnil
+ \ifnum \count@<\tw@ \count@=\tw@ \fi
+ \advance\tabu@start \m@ne
+ \ifnum \tabu@start<\z@ \tabu@start \z@ \fi
+ \tabu@rowcolorseries #3\in@..\in@ \@nnil
+}% \tabu@rowcolors
+\def\tabu@rowcolorseries #1..#2\in@ #3\@nnil {%
+ \ifx \in@#1\relax
+ \iftabu@everyrow \toks@{\def\tabu@rc@{}\let\tabu@rc@L \tabu@rc@}%
+ \else \gdef\tabu@rc@{}\global\let\tabu@rc@G \tabu@rc@
+ \fi
+ \else
+ \ifx \\#2\\\tabu@rowcolorserieserror \fi
+ \tabu@sanitizearg{#1}\tabu@temp
+ \tabu@sanitizearg{#2}\@tempa
+ \advance\count@ \m@ne
+ \iftabu@everyrow
+ \def\tabu@rc@ ##1##2##3##4{\def\tabu@rc@{%
+ \ifnum ##2=\c@taburow
+ \definecolorseries{tabu@rcseries@\the\tabu@nested}{rgb}{last}{##3}{##4}\fi
+ \ifnum \c@taburow<##2 \else
+ \ifnum \tabu@modulo {\c@taburow-##2}{##1+1}=\z@
+ \resetcolorseries[{##1}]{tabu@rcseries@\the\tabu@nested}\fi
+ \xglobal\colorlet{tabu@rc@\the\tabu@nested}{tabu@rcseries@\the\tabu@nested!!+}%
+ \rowcolor{tabu@rc@\the\tabu@nested}\fi}%
+ }\edef\x{\noexpand\tabu@rc@ {\the\count@}
+ {\the\tabu@start}
+ {\tabu@temp}
+ {\@tempa}%
+ }\x
+ \toks@\expandafter{\expandafter\def\expandafter\tabu@rc@\expandafter{\tabu@rc@}}%
+ \toks@\expandafter{\the\toks@ \let\tabu@rc@L \tabu@rc@ \ignorespaces}%
+ \else % inside \noalign
+ \definecolorseries{tabu@rcseries@\the\tabu@nested}{rgb}{last}{\tabu@temp}{\@tempa}%
+ \expandafter\resetcolorseries\expandafter[\the\count@]{tabu@rcseries@\the\tabu@nested}%
+ \xglobal\colorlet{tabu@rc@\the\tabu@nested}{tabu@rcseries@\the\tabu@nested!!+}%
+ \let\noalign \relax \rowcolor{tabu@rc@\the\tabu@nested}%
+ \def\tabu@rc@ ##1##2{\gdef\tabu@rc@{%
+ \ifnum \tabu@modulo {\c@taburow-##2}{##1+1}=\@ne
+ \resetcolorseries[{##1}]{tabu@rcseries@\the\tabu@nested}\fi
+ \xglobal\colorlet{tabu@rc@\the\tabu@nested}{tabu@rcseries@\the\tabu@nested!!+}%
+ \rowcolor{tabu@rc@\the\tabu@nested}}%
+ }\edef\x{\noexpand\tabu@rc@{\the\count@}{\the\c@taburow}}\x
+ \global\let\tabu@rc@G \tabu@rc@
+ \fi
+ \fi
+ \tabu@everyrow@egroup
+}% \tabu@rowcolorseries
+\tabuDisableCommands {\let\tabu@rc@ \@empty }
+\def\tabu@rowcolorserieserror {\PackageError{tabu}
+ {Invalid syntax for \string\taburowcolors
+ \MessageBreak Please look at the documentation!}\@ehd
+}% \tabu@rowcolorserieserror
+\newcommand*\tabureset {%
+ \tabulinesep=\z@ \extrarowsep=\z@ \extratabsurround=\z@
+ \tabulinestyle{}\everyrow{}\taburulecolor||{}\taburowcolors{}%
+}% \tabureset
+%% Parsing the line styles ------------------------------------------
+\def\tabu@getline #1{\begingroup
+ \csname \ifcsname if@safe@actives\endcsname %
+ @safe@activestrue\else
+ relax\fi \endcsname
+ \edef\tabu@temp{#1}\tabu@sanitizearg{#1}\@tempa
+ \let\tabu@thestyle \relax
+ \ifcsname tabu@linestyle@\@tempa \endcsname
+ \edef\tabu@thestyle{\endgroup
+ \def\tabu@thestyle{\expandafter\noexpand
+ \csname tabu@linestyle@\@tempa\endcsname}%
+ }\tabu@thestyle
+ \else \expandafter\tabu@definestyle \tabu@temp \@nil
+ \fi
+}% \tabu@getline
+\def\tabu@definestyle #1#2\@nil {\endlinechar \m@ne \makeatletter
+ \tabu@thick \maxdimen \tabu@on \maxdimen \tabu@off \maxdimen
+ \let\tabu@c@lon \@undefined \let\tabu@c@loff \@undefined
+ \ifodd 1\ifcat .#1\else\ifcat\relax #1\else 0\fi\fi % catcode 12 or non expandable cs
+ \def\tabu@temp{\tabu@getparam{thick}}%
+ \else \def\tabu@temp{\tabu@getparam{thick}\maxdimen}%
+ \fi
+ {%
+ \let\tabu@ \relax
+ \def\:{\obeyspaces \tabu@oXIII \tabu@commaXIII \edef\:}% (space active \: happy ;-))
+ \scantokens{\:{\tabu@temp #1#2 \tabu@\tabu@}}%
+ \expandafter}\expandafter
+ \def\expandafter\:\expandafter{\:}% line spec rewritten now ;-)
+ \def\;{\def\:}%
+ \scantokens\expandafter{\expandafter\;\expandafter{\:}}% space is now inactive (catcode 10)
+ \let\tabu@ \tabu@getcolor \:% all arguments are ready now ;-)
+ \ifdefined\tabu@c@lon \else \let\tabu@c@lon\@empty \fi
+ \ifx \tabu@c@lon\@empty \def\tabu@c@lon{\CT@arc@}\fi
+ \ifdefined\tabu@c@loff \else \let\tabu@c@loff \@empty \fi
+ \ifdim \tabu@on=\maxdimen \ifdim \tabu@off<\maxdimen
+ \tabu@on \tabulineon \fi\fi
+ \ifdim \tabu@off=\maxdimen \ifdim \tabu@on<\maxdimen
+ \tabu@off \tabulineoff \fi\fi
+ \ifodd 1\ifdim \tabu@off=\maxdimen \ifdim \tabu@on=\maxdimen 0 \fi\fi
+ \in@true %
+ \else \in@false %
+ \fi
+ \ifdim\tabu@thick=\maxdimen \def\tabu@thick{\arrayrulewidth}%
+ \else \edef\tabu@thick{\the\tabu@thick}%
+ \fi
+ \edef \tabu@thestyle ##1##2{\endgroup
+ \def\tabu@thestyle{%
+ \ifin@ \noexpand\tabu@leadersstyle {\tabu@thick}
+ {\the\tabu@on}{##1}
+ {\the\tabu@off}{##2}%
+ \else \noexpand\tabu@rulesstyle
+ {##1\vrule width \tabu@thick}%
+ {##1\leaders \hrule height \tabu@thick \hfil}%
+ \fi}%
+ }\expandafter \expandafter
+ \expandafter \tabu@thestyle \expandafter
+ \expandafter \expandafter
+ {\expandafter\tabu@c@lon\expandafter}\expandafter{\tabu@c@loff}%
+}% \tabu@definestyle
+{\catcode`\O=\active \lccode`\O=`\o \catcode`\,=\active
+ \lowercase{\gdef\tabu@oXIII {\catcode`\o=\active \let O=\tabu@oxiii}}
+ \gdef\tabu@commaXIII {\catcode`\,=\active \let ,=\space}
+}% \catcode
+\def\tabu@oxiii #1{%
+ \ifcase \ifx n#1\z@ \else
+ \ifx f#1\@ne\else
+ \tw@ \fi\fi
+ \expandafter\tabu@onxiii
+ \or \expandafter\tabu@ofxiii
+ \else o%
+ \fi#1}%
+\def\tabu@onxiii #1#2{%
+ \ifcase \ifx !#2\tw@ \else
+ \ifcat.\noexpand#2\z@ \else
+ \ifx \tabu@spxiii#2\@ne\else
+ \tw@ \fi\fi\fi
+ \tabu@getparam{on}#2\expandafter\@gobble
+ \or \expandafter\tabu@onxiii % (space is active)
+ \else o\expandafter\@firstofone
+ \fi{#1#2}}%
+\def\tabu@ofxiii #1#2{%
+ \ifx #2f\expandafter\tabu@offxiii
+ \else o\expandafter\@firstofone
+ \fi{#1#2}}
+\def\tabu@offxiii #1#2{%
+ \ifcase \ifx !#2\tw@ \else
+ \ifcat.\noexpand#2\z@ \else
+ \ifx\tabu@spxiii#2\@ne \else
+ \tw@ \fi\fi\fi
+ \tabu@getparam{off}#2\expandafter\@gobble
+ \or \expandafter\tabu@offxiii % (space is active)
+ \else o\expandafter\@firstofone
+ \fi{#1#2}}
+\def\tabu@getparam #1{\tabu@ \csname tabu@#1\endcsname=}
+\def\tabu@getcolor #1{% \tabu@ <- \tabu@getcolor after \edef
+ \ifx \tabu@#1\else % no more spec
+ \let\tabu@theparam=#1\afterassignment \tabu@getc@l@r #1\fi
+}% \tabu@getcolor
+\def\tabu@getc@l@r #1\tabu@ {%
+ \def\tabu@temp{#1}\tabu@strtrim \tabu@temp
+ \ifx \tabu@temp\@empty
+ \else%\ifcsname \string\color@\tabu@temp \endcsname % if the color exists
+ \ifx \tabu@theparam \tabu@off \let\tabu@c@loff \tabu@c@l@r
+ \else \let\tabu@c@lon \tabu@c@l@r
+ \fi
+ %\else \tabu@warncolour{\tabu@temp}%
+ \fi%\fi
+ \tabu@ % next spec
+}% \tabu@getc@l@r
+\def\tabu@warncolour #1{\PackageWarning{tabu}
+ {Color #1 is not defined. Default color used}%
+}% \tabu@warncolour
+\def\tabu@leadersstyle #1#2#3#4#5{\def\tabu@leaders{{#1}{#2}{#3}{#4}{#5}}%
+ \ifx \tabu@leaders\tabu@leaders@G \else
+ \tabu@LEADERS{#1}{#2}{#3}{#4}{#5}\fi
+}% \tabu@leadersstyle
+\def\tabu@rulesstyle #1#2{\let\tabu@leaders \@undefined
+ \gdef\tabu@thevrule{#1}\gdef\tabu@thehrule{#2}%
+}% \tabu@rulesstyle
+%% The leaders boxes ------------------------------------------------
+\def\tabu@LEADERS #1#2#3#4#5{%% width, dash, dash color, gap, gap color
+ {\let\color \tabu@color % => during trials -> \color = \tabu@nocolor
+ {% % but the leaders boxes should have colors !
+ \def\@therule{\vrule}\def\@thick{height}\def\@length{width}%
+ \def\@box{\hbox}\def\@unbox{\unhbox}\def\@elt{\wd}%
+ \def\@skip{\hskip}\def\@ss{\hss}\def\tabu@leads{\tabu@hleads}%
+ \tabu@l@@d@rs {#1}{#2}{#3}{#4}{#5}%
+ \global\let\tabu@thehleaders \tabu@theleaders
+ }%
+ {%
+ \def\@therule{\hrule}\def\@thick{width}\def\@length{height}%
+ \def\@box{\vbox}\def\@unbox{\unvbox}\def\@elt{\ht}%
+ \def\@skip{\vskip}\def\@ss{\vss}\def\tabu@leads{\tabu@vleads}%
+ \tabu@l@@d@rs {#1}{#2}{#3}{#4}{#5}%
+ \global\let\tabu@thevleaders \tabu@theleaders
+ }%
+ \gdef\tabu@leaders@G{{#1}{#2}{#3}{#4}{#5}}%
+ }%
+}% \tabu@LEADERS
+\def\tabu@therule #1#2{\@therule \@thick#1\@length\dimexpr#2/2 \@depth\z@}
+\def\tabu@l@@d@rs #1#2#3#4#5{%% width, dash, dash color, gap, gap color
+ \global\setbox \tabu@leads=\@box{%
+ {#3\tabu@therule{#1}{#2}}%
+ \ifx\\#5\\\@skip#4\else{#5\tabu@therule{#1}{#4*2}}\fi
+ {#3\tabu@therule{#1}{#2}}}%
+ \global\setbox\tabu@leads=\@box to\@elt\tabu@leads{\@ss
+ {#3\tabu@therule{#1}{#2}}\@unbox\tabu@leads}%
+ \edef\tabu@theleaders ##1{\def\noexpand\tabu@theleaders {%
+ {##1\tabu@therule{#1}{#2}}%
+ \xleaders \copy\tabu@leads \@ss
+ \tabu@therule{0pt}{-#2}{##1\tabu@therule{#1}{#2}}}%
+ }\tabu@theleaders{#3}%
+}% \tabu@l@@d@rs
+%% \tabu \endtabu \tabu* \longtabu \endlongtabu \longtabu* ----------
+\newcommand*\tabu {\tabu@longfalse
+ \ifmmode \def\tabu@ {\array}\def\endtabu {\endarray}%
+ \else \def\tabu@ {\tabu@tabular}\def\endtabu {\endtabular}\fi
+ \expandafter\let\csname tabu*\endcsname \tabu
+ \expandafter\def\csname endtabu*\endcsname{\endtabu}%
+ \tabu@spreadfalse \tabu@negcoeffalse \tabu@settarget
+}% {tabu}
+\let\tabu@tabular \tabular %
+\expandafter\def\csname tabu*\endcsname{\tabuscantokenstrue \tabu}
+\newcommand*\longtabu {\tabu@longtrue
+ \ifmmode\PackageError{tabu}{longtabu not allowed in math mode}\fi
+ \def\tabu@{\longtable}\def\endlongtabu{\endlongtable}%
+ \LTchunksize=\@M
+ \expandafter\let\csname tabu*\endcsname \tabu
+ \expandafter\def\csname endlongtabu*\endcsname{\endlongtabu}%
+ \let\LT@startpbox \tabu@LT@startpbox % \everypar{ array struts }
+ \tabu@spreadfalse \tabu@negcoeffalse \tabu@settarget
+}% {longtabu}
+\expandafter\def\csname longtabu*\endcsname{\tabuscantokenstrue \longtabu}
+\def\tabu@nolongtabu{\PackageError{tabu}
+ {longtabu requires the longtable package}\@ehd}
+%% Read the target and then : \tabular or \@array ------------------
+\def\tabu@settarget {\futurelet\@let@token \tabu@sett@rget }
+\def\tabu@sett@rget {\tabu@target \z@
+ \ifcase \ifx \bgroup\@let@token \z@ \else
+ \ifx \@sptoken\@let@token \@ne \else
+ \if t\@let@token \tw@ \else
+ \if s\@let@token \thr@@\else
+ \z@\fi\fi\fi\fi
+ \expandafter\tabu@begin
+ \or \expandafter\tabu@gobblespace\expandafter\tabu@settarget
+ \or \expandafter\tabu@to
+ \or \expandafter\tabu@spread
+ \fi
+}% \tabu@sett@rget
+\def\tabu@to to{\def\tabu@halignto{to}\tabu@gettarget}
+\def\tabu@spread spread{\tabu@spreadtrue\def\tabu@halignto{spread}\tabu@gettarget}
+\def\tabu@gettarget {\afterassignment\tabu@linegoaltarget \tabu@target }
+\def\tabu@linegoaltarget {\futurelet\tabu@temp \tabu@linegoalt@rget }
+\def\tabu@linegoalt@rget {%
+ \ifx \tabu@temp\LNGL@setlinegoal
+ \LNGL@setlinegoal \expandafter \@firstoftwo \fi % @gobbles \LNGL@setlinegoal
+ \tabu@begin
+}% \tabu@linegoalt@rget
+\def\tabu@begin #1#{%
+ \iftabu@measuring \expandafter\tabu@nestedmeasure \fi
+ \ifdim \tabu@target=\z@ \let\tabu@halignto \@empty
+ \else \edef\tabu@halignto{\tabu@halignto\the\tabu@target}%
+ \fi
+ \@testopt \tabu@tabu@ \tabu@aligndefault #1\@nil
+}% \tabu@begin
+\long\def\tabu@tabu@ [#1]#2\@nil #3{\tabu@setup
+ \def\tabu@align {#1}\def\tabu@savedpream{\NC@find #3}%
+ \tabu@ [\tabu@align ]#2{#3\tabu@rewritefirst }%
+}% \tabu@tabu@
+\def\tabu@nestedmeasure {%
+ \ifodd 1\iftabu@spread \else \ifdim\tabu@target=\z@ \else 0 \fi\fi\relax
+ \tabu@spreadtrue
+ \else \begingroup \iffalse{\fi \ifnum0=`}\fi
+ \toks@{}\def\tabu@stack{b}%
+ \expandafter\tabu@collectbody\expandafter\tabu@quickrule
+ \expandafter\endgroup
+ \fi
+}% \tabu@nestedmeasure
+\def\tabu@quickrule {\indent\vrule height\z@ depth\z@ width\tabu@target}
+%% \tabu@setup \tabu@init \tabu@indent
+\def\tabu@setup{\tabu@alloc@
+ \ifcase \tabu@nested
+ \ifmmode \else \iftabu@spread\else \ifdim\tabu@target=\z@
+ \let\tabu@afterendpar \par
+ \fi\fi\fi
+ \def\tabu@aligndefault{c}\tabu@init \tabu@indent
+ \else %
+ \def\tabu@aligndefault{t}\let\tabudefaulttarget \linewidth
+ \fi
+ \let\tabu@thetarget \tabudefaulttarget \let\tabu@restored \@undefined
+ \edef\tabu@NC@list{\the\NC@list}\NC@list{\NC@do \tabu@rewritefirst}%
+ \everycr{}\let\@startpbox \tabu@startpbox % for nested tabu inside longtabu...
+ \let\@endpbox \tabu@endpbox % idem " " " " " "
+ \let\@tabarray \tabu@tabarray % idem " " " " " "
+ \tabu@setcleanup \tabu@setreset
+}% \tabu@setup
+\def\tabu@init{\tabu@starttimer \tabu@measuringfalse
+ \edef\tabu@hfuzz {\the\dimexpr\hfuzz+1sp}\global\tabu@footnotes{}%
+ \let\firsthline \tabu@firsthline \let\lasthline \tabu@lasthline
+ \let\firstline \tabu@firstline \let\lastline \tabu@lastline
+ \let\hline \tabu@hline \let\@xhline \tabu@xhline
+ \let\color \tabu@color \let\@arstrutbox \tabu@arstrutbox
+ \iftabu@colortbl\else\let\LT@@hline \tabu@LT@@hline \fi
+ \tabu@trivlist %
+ \let\@footnotetext \tabu@footnotetext \let\@xfootnotetext \tabu@xfootnotetext
+ \let\@xfootnote \tabu@xfootnote \let\centering \tabu@centering
+ \let\raggedright \tabu@raggedright \let\raggedleft \tabu@raggedleft
+ \let\tabudecimal \tabu@tabudecimal \let\Centering \tabu@Centering
+ \let\RaggedRight \tabu@RaggedRight \let\RaggedLeft \tabu@RaggedLeft
+ \let\justifying \tabu@justifying \let\rowfont \tabu@rowfont
+ \let\fbox \tabu@fbox \let\color@b@x \tabu@color@b@x
+ \let\tabu@@everycr \everycr \let\tabu@@everypar \everypar
+ \let\tabu@prepnext@tokORI \prepnext@tok\let\prepnext@tok \tabu@prepnext@tok
+ \let\tabu@multicolumnORI\multicolumn \let\multicolumn \tabu@multicolumn
+ \let\tabu@startpbox \@startpbox % for nested tabu inside longtabu pfff !!!
+ \let\tabu@endpbox \@endpbox % idem " " " " " " "
+ \let\tabu@tabarray \@tabarray % idem " " " " " " "
+ \tabu@adl@fix \let\endarray \tabu@endarray % colortbl & arydshln (delarray)
+ \iftabu@colortbl\CT@everycr\expandafter{\expandafter\iftabu@everyrow \the\CT@everycr \fi}\fi
+}% \tabu@init
+\def\tabu@indent{% correction for indentation
+ \ifdim \parindent>\z@\ifx \linewidth\tabudefaulttarget
+ \everypar\expandafter{%
+ \the\everypar\everypar\expandafter{\the\everypar}%
+ \setbox\z@=\lastbox
+ \ifdim\wd\z@>\z@ \edef\tabu@thetarget
+ {\the\dimexpr -\wd\z@+\tabudefaulttarget}\fi
+ \box\z@}%
+ \fi\fi
+}% \tabu@indent
+\def\tabu@setcleanup {% saves last global assignments
+ \ifodd 1\ifmmode \else \iftabu@long \else 0\fi\fi\relax
+ \def\tabu@aftergroupcleanup{%
+ \def\tabu@aftergroupcleanup{\aftergroup\tabu@cleanup}}%
+ \else
+ \def\tabu@aftergroupcleanup{%
+ \aftergroup\aftergroup\aftergroup\tabu@cleanup
+ \let\tabu@aftergroupcleanup \relax}%
+ \fi
+ \let\tabu@arc@Gsave \tabu@arc@G
+ \let\tabu@arc@G \tabu@arc@L %
+ \let\tabu@drsc@Gsave \tabu@drsc@G
+ \let\tabu@drsc@G \tabu@drsc@L %
+ \let\tabu@ls@Gsave \tabu@ls@G
+ \let\tabu@ls@G \tabu@ls@L %
+ \let\tabu@rc@Gsave \tabu@rc@G
+ \let\tabu@rc@G \tabu@rc@L %
+ \let\tabu@evr@Gsave \tabu@evr@G
+ \let\tabu@evr@G \tabu@evr@L %
+ \let\tabu@celllalign@save \tabu@celllalign
+ \let\tabu@cellralign@save \tabu@cellralign
+ \let\tabu@cellleft@save \tabu@cellleft
+ \let\tabu@cellright@save \tabu@cellright
+ \let\tabu@@celllalign@save \tabu@@celllalign
+ \let\tabu@@cellralign@save \tabu@@cellralign
+ \let\tabu@@cellleft@save \tabu@@cellleft
+ \let\tabu@@cellright@save \tabu@@cellright
+ \let\tabu@rowfontreset@save \tabu@rowfontreset
+ \let\tabu@@rowfontreset@save\tabu@@rowfontreset
+ \let\tabu@rowfontreset \@empty
+ \edef\tabu@alloc@save {\the\tabu@alloc}% restore at \tabu@reset
+ \edef\c@taburow@save {\the\c@taburow}%
+ \edef\tabu@naturalX@save {\the\tabu@naturalX}%
+ \let\tabu@naturalXmin@save \tabu@naturalXmin
+ \let\tabu@naturalXmax@save \tabu@naturalXmax
+ \let\tabu@mkarstrut@save \tabu@mkarstrut
+ \edef\tabu@clarstrut{%
+ \extrarowheight \the\dimexpr \ht\@arstrutbox-\ht\strutbox \relax
+ \extrarowdepth \the\dimexpr \dp\@arstrutbox-\dp\strutbox \relax
+ \let\noexpand\@arraystretch \@ne \noexpand\tabu@rearstrut}%
+}% \tabu@setcleanup
+\def\tabu@cleanup {\begingroup
+ \globaldefs\@ne \tabu@everyrowtrue
+ \let\tabu@arc@G \tabu@arc@Gsave
+ \let\CT@arc@ \tabu@arc@G
+ \let\tabu@drsc@G \tabu@drsc@Gsave
+ \let\CT@drsc@ \tabu@drsc@G
+ \let\tabu@ls@G \tabu@ls@Gsave
+ \let\tabu@ls@ \tabu@ls@G
+ \let\tabu@rc@G \tabu@rc@Gsave
+ \let\tabu@rc@ \tabu@rc@G
+ \let\CT@do@color \relax
+ \let\tabu@evr@G \tabu@evr@Gsave
+ \let\tabu@celllalign \tabu@celllalign@save
+ \let\tabu@cellralign \tabu@cellralign@save
+ \let\tabu@cellleft \tabu@cellleft@save
+ \let\tabu@cellright \tabu@cellright@save
+ \let\tabu@@celllalign \tabu@@celllalign@save
+ \let\tabu@@cellralign \tabu@@cellralign@save
+ \let\tabu@@cellleft \tabu@@cellleft@save
+ \let\tabu@@cellright \tabu@@cellright@save
+ \let\tabu@rowfontreset \tabu@rowfontreset@save
+ \let\tabu@@rowfontreset \tabu@@rowfontreset@save
+ \tabu@naturalX =\tabu@naturalX@save
+ \let\tabu@naturalXmax \tabu@naturalXmax@save
+ \let\tabu@naturalXmin \tabu@naturalXmin@save
+ \let\tabu@mkarstrut \tabu@mkarstrut@save
+ \c@taburow =\c@taburow@save
+ \ifcase \tabu@nested \tabu@alloc \m@ne\fi
+ \endgroup %
+ \ifcase \tabu@nested
+ \the\tabu@footnotes \global\tabu@footnotes{}%
+ \tabu@afterendpar \tabu@elapsedtime
+ \fi
+ \tabu@clarstrut
+ \everyrow\expandafter {\tabu@evr@G}%
+}% \tabu@cleanup
+\let\tabu@afterendpar \relax
+\def\tabu@setreset {%
+ \edef\tabu@savedparams {% \relax for \tabu@message@save
+ \ifmmode \col@sep \the\arraycolsep
+ \else \col@sep \the\tabcolsep \fi \relax
+ \arrayrulewidth \the\arrayrulewidth \relax
+ \doublerulesep \the\doublerulesep \relax
+ \extratabsurround \the\extratabsurround \relax
+ \extrarowheight \the\extrarowheight \relax
+ \extrarowdepth \the\extrarowdepth \relax
+ \abovetabulinesep \the\abovetabulinesep \relax
+ \belowtabulinesep \the\belowtabulinesep \relax
+ \def\noexpand\arraystretch{\arraystretch}%
+ \ifdefined\minrowclearance \minrowclearance\the\minrowclearance\relax\fi}%
+ \begingroup
+ \@temptokena\expandafter{\tabu@savedparams}% => only for \savetabu / \usetabu
+ \ifx \tabu@arc@L\relax \else \tabu@setsave \tabu@arc@L \fi
+ \ifx \tabu@drsc@L\relax \else \tabu@setsave \tabu@drsc@L \fi
+ \tabu@setsave \tabu@ls@L \tabu@setsave \tabu@evr@L
+ \expandafter \endgroup \expandafter
+ \def\expandafter\tabu@saved@ \expandafter{\the\@temptokena
+ \let\tabu@arc@G \tabu@arc@L
+ \let\tabu@drsc@G \tabu@drsc@L
+ \let\tabu@ls@G \tabu@ls@L
+ \let\tabu@rc@G \tabu@rc@L
+ \let\tabu@evr@G \tabu@evr@L}%
+ \def\tabu@reset{\tabu@savedparams
+ \tabu@everyrowtrue \c@taburow \z@
+ \let\CT@arc@ \tabu@arc@L
+ \let\CT@drsc@ \tabu@drsc@L
+ \let\tabu@ls@ \tabu@ls@L
+ \let\tabu@rc@ \tabu@rc@L
+ \global\tabu@alloc \tabu@alloc@save
+ \everyrow\expandafter{\tabu@evr@L}}%
+}% \tabu@reset
+\def\tabu@setsave #1{\expandafter\tabu@sets@ve #1\@nil{#1}}
+\long\def\tabu@sets@ve #1\@nil #2{\@temptokena\expandafter{\the\@temptokena \def#2{#1}}}
+%% The Rewriting Process -------------------------------------------
+\def\tabu@newcolumntype #1{%
+ \expandafter\tabu@new@columntype
+ \csname NC@find@\string#1\expandafter\endcsname
+ \csname NC@rewrite@\string#1\endcsname
+ {#1}%
+}% \tabu@newcolumntype
+\def\tabu@new@columntype #1#2#3{%
+ \def#1##1#3{\NC@{##1}}%
+ \let#2\relax \newcommand*#2%
+}% \tabu@new@columntype
+\def\tabu@privatecolumntype #1{%
+ \expandafter\tabu@private@columntype
+ \csname NC@find@\string#1\expandafter\endcsname
+ \csname NC@rewrite@\string#1\expandafter\endcsname
+ \csname tabu@NC@find@\string#1\expandafter\endcsname
+ \csname tabu@NC@rewrite@\string#1\endcsname
+ {#1}%
+}% \tabu@privatecolumntype
+\def\tabu@private@columntype#1#2#3#4{%
+ \g@addto@macro\tabu@privatecolumns{\let#1#3\let#2#4}%
+ \tabu@new@columntype#3#4%
+}% \tabu@private@columntype
+\let\tabu@privatecolumns \@empty
+\newcommand*\tabucolumn [1]{\expandafter \def \expandafter
+ \tabu@highprioritycolumns\expandafter{\tabu@highprioritycolumns
+ \NC@do #1}}%
+\let\tabu@highprioritycolumns \@empty
+%% The | ``column'' : rewriting process --------------------------
+\tabu@privatecolumntype |{\tabu@rewritevline}
+\newcommand*\tabu@rewritevline[1][]{\tabu@vlinearg{#1}%
+ \expandafter \NC@find \tabu@rewritten}
+\def\tabu@lines #1{%
+ \ifx|#1\else \tabu@privatecolumntype #1{\tabu@rewritevline}\fi
+ \NC@list\expandafter{\the\NC@list \NC@do #1}%
+}% \tabu@lines@
+\def\tabu@vlinearg #1{%
+ \ifx\\#1\\\def\tabu@thestyle {\tabu@ls@}%
+ \else\tabu@getline {#1}%
+ \fi
+ \def\tabu@rewritten ##1{\def\tabu@rewritten{!{##1\tabu@thevline}}%
+ }\expandafter\tabu@rewritten\expandafter{\tabu@thestyle}%
+ \expandafter \tabu@keepls \tabu@thestyle \@nil
+}% \tabu@vlinearg
+\def\tabu@keepls #1\@nil{%
+ \ifcat $\@cdr #1\@nil $%
+ \ifx \relax#1\else
+ \ifx \tabu@ls@#1\else
+ \let#1\relax
+ \xdef\tabu@mkpreambuffer{\tabu@mkpreambuffer
+ \tabu@savels\noexpand#1}\fi\fi\fi
+}% \tabu@keepls
+\def\tabu@thevline {\begingroup
+ \ifdefined\tabu@leaders
+ \setbox\@tempboxa=\vtop to\dimexpr
+ \ht\@arstrutbox+\dp\@arstrutbox{{\tabu@thevleaders}}%
+ \ht\@tempboxa=\ht\@arstrutbox \dp\@tempboxa=\dp\@arstrutbox
+ \box\@tempboxa
+ \else
+ \tabu@thevrule
+ \fi \endgroup
+}% \tabu@thevline
+\def\tabu@savels #1{%
+ \expandafter\let\csname\string#1\endcsname #1%
+ \expandafter\def\expandafter\tabu@reset\expandafter{\tabu@reset
+ \tabu@resetls#1}}%
+\def\tabu@resetls #1{\expandafter\let\expandafter#1\csname\string#1\endcsname}%
+%% \multicolumn inside tabu environment -----------------------------
+\tabu@newcolumntype \tabu@rewritemulticolumn{%
+ \aftergroup \tabu@endrewritemulticolumn % after \@mkpream group
+ \NC@list{\NC@do *}\tabu@textbar \tabu@lines
+ \tabu@savedecl
+ \tabu@privatecolumns
+ \NC@list\expandafter{\the\expandafter\NC@list \tabu@NC@list}%
+ \let\tabu@savels \relax
+ \NC@find
+}% \tabu@rewritemulticolumn
+\def\tabu@endrewritemulticolumn{\gdef\tabu@mkpreambuffer{}\endgroup}
+\def\tabu@multicolumn{\tabu@ifenvir \tabu@multic@lumn \tabu@multicolumnORI}
+\long\def\tabu@multic@lumn #1#2#3{\multispan{#1}\begingroup
+ \tabu@everyrowtrue
+ \NC@list{\NC@do \tabu@rewritemulticolumn}%
+ \expandafter\@gobbletwo % gobbles \multispan{#1}
+ \tabu@multicolumnORI{#1}{\tabu@rewritemulticolumn #2}%
+ {\iftabuscantokens \tabu@rescan \else \expandafter\@firstofone \fi
+ {#3}}%
+}% \tabu@multic@lumn
+%% The X column(s): rewriting process -----------------------------
+\tabu@privatecolumntype X[1][]{\begingroup \tabu@siunitx{\endgroup \tabu@rewriteX {#1}}}
+\def\tabu@nosiunitx #1{#1{}{}\expandafter \NC@find \tabu@rewritten }
+\def\tabu@siunitx #1{\@ifnextchar \bgroup
+ {\tabu@rewriteX@Ss{#1}}
+ {\tabu@nosiunitx{#1}}}
+\def\tabu@rewriteX@Ss #1#2{\@temptokena{}%
+ \@defaultunits \let\tabu@temp =#2\relax\@nnil
+ \ifodd 1\ifx S\tabu@temp \else \ifx s\tabu@temp \else 0 \fi\fi
+ \def\NC@find{\def\NC@find >####1####2<####3\relax{#1 {####1}{####3}%
+ }\expandafter\NC@find \the\@temptokena \relax
+ }\expandafter\NC@rewrite@S \@gobble #2\relax
+ \else \tabu@siunitxerror
+ \fi
+ \expandafter \NC@find \tabu@rewritten
+}% \tabu@rewriteX@Ss
+\def\tabu@siunitxerror {\PackageError{tabu}{Not a S nor s column !
+ \MessageBreak X column can only embed siunitx S or s columns}\@ehd
+}% \tabu@siunitxerror
+\def\tabu@rewriteX #1#2#3{\tabu@Xarg {#1}{#2}{#3}%
+ \iftabu@measuring
+ \else \tabu@measuringtrue % first X column found in the preamble
+ \let\@halignto \relax \let\tabu@halignto \relax
+ \iftabu@spread \tabu@spreadtarget \tabu@target \tabu@target \z@
+ \else \tabu@spreadtarget \z@ \fi
+ \ifdim \tabu@target=\z@
+ \setlength\tabu@target \tabu@thetarget
+ \tabu@message{\tabu@message@defaulttarget}%
+ \else \tabu@message{\tabu@message@target}\fi
+ \fi
+}% \tabu@rewriteX
+\def\tabu@rewriteXrestore #1#2#3{\let\@halignto \relax
+ \def\tabu@rewritten{l}}
+\def\tabu@Xarg #1#2#3{%
+ \advance\tabu@Xcol \@ne \let\tabu@Xlcr \@empty
+ \let\tabu@Xdisp \@empty \let\tabu@Xmath \@empty
+ \ifx\\#1\\%
+ \def\tabu@rewritten{p}\tabucolX \p@ %
+ \else
+ \let\tabu@rewritten \@empty \let\tabu@temp \@empty \tabucolX \z@
+ \tabu@Xparse {}#1\relax
+ \fi
+ \tabu@Xrewritten{#2}{#3}%
+}% \tabu@Xarg
+\def\tabu@Xparse #1{\futurelet\@let@token \tabu@Xtest}
+\expandafter\def\expandafter\tabu@Xparsespace\space{\tabu@Xparse{}}
+\def\tabu@Xtest{%
+ \ifcase \ifx \relax\@let@token \z@ \else
+ \if ,\@let@token \m@ne\else
+ \if p\@let@token 1\else
+ \if m\@let@token 2\else
+ \if b\@let@token 3\else
+ \if l\@let@token 4\else
+ \if c\@let@token 5\else
+ \if r\@let@token 6\else
+ \if j\@let@token 7\else
+ \if L\@let@token 8\else
+ \if C\@let@token 9\else
+ \if R\@let@token 10\else
+ \if J\@let@token 11\else
+ \ifx \@sptoken\@let@token 12\else
+ \if .\@let@token 13\else
+ \if -\@let@token 13\else
+ \ifcat $\@let@token 14\else
+ 15\fi\fi\fi\fi\fi\fi\fi\fi\fi\fi\fi\fi\fi\fi\fi\fi\fi\relax
+ \or \tabu@Xtype {p}%
+ \or \tabu@Xtype {m}%
+ \or \tabu@Xtype {b}%
+ \or \tabu@Xalign \raggedright\relax
+ \or \tabu@Xalign \centering\relax
+ \or \tabu@Xalign \raggedleft\relax
+ \or \tabu@Xalign \tabu@justify\relax
+ \or \tabu@Xalign \RaggedRight\raggedright
+ \or \tabu@Xalign \Centering\centering
+ \or \tabu@Xalign \RaggedLeft\raggedleft
+ \or \tabu@Xalign \justifying\tabu@justify
+ \or \expandafter \tabu@Xparsespace
+ \or \expandafter \tabu@Xcoef
+ \or \expandafter \tabu@Xm@th
+ \or \tabu@Xcoef{}%
+ \else\expandafter \tabu@Xparse
+ \fi
+}% \tabu@Xtest
+\def\tabu@Xalign #1#2{%
+ \ifx \tabu@Xlcr\@empty \else \PackageWarning{tabu}
+ {Duplicate horizontal alignment specification}\fi
+ \ifdefined#1\def\tabu@Xlcr{#1}\let#1\relax
+ \else \def\tabu@Xlcr{#2}\let#2\relax\fi
+ \expandafter\tabu@Xparse
+}% \tabu@Xalign
+\def\tabu@Xtype #1{%
+ \ifx \tabu@rewritten\@empty \else \PackageWarning{tabu}
+ {Duplicate vertical alignment specification}\fi
+ \def\tabu@rewritten{#1}\expandafter\tabu@Xparse
+}% \tabu@Xtype
+\def\tabu@Xcoef#1{\edef\tabu@temp{\tabu@temp#1}%
+ \afterassignment\tabu@Xc@ef \tabu@cnt\number\if-#10\fi
+}% \tabu@Xcoef
+\def\tabu@Xc@ef{\advance\tabucolX \tabu@temp\the\tabu@cnt\p@
+ \tabu@Xparse{}%
+}% \tabu@Xc@ef
+\def\tabu@Xm@th #1{\futurelet \@let@token \tabu@Xd@sp}
+\def\tabu@Xd@sp{\let\tabu@Xmath=$%
+ \ifx $\@let@token \def\tabu@Xdisp{\displaystyle}%
+ \expandafter\tabu@Xparse
+ \else \expandafter\tabu@Xparse\expandafter{\expandafter}%
+ \fi
+}% \tabu@Xd@sp
+\def\tabu@Xrewritten {%
+ \ifx \tabu@rewritten\@empty \def\tabu@rewritten{p}\fi
+ \ifdim \tabucolX<\z@ \tabu@negcoeftrue
+ \else\ifdim \tabucolX=\z@ \tabucolX \p@
+ \fi\fi
+ \edef\tabu@temp{{\the\tabu@Xcol}{\tabu@strippt\tabucolX}}%
+ \edef\tabu@Xcoefs{\tabu@Xcoefs \tabu@ \tabu@temp}%
+ \edef\tabu@rewritten ##1##2{\def\noexpand\tabu@rewritten{%
+ >{\tabu@Xlcr \ifx$\tabu@Xmath$\tabu@Xdisp\fi ##1}%
+ \tabu@rewritten {\tabu@hsize \tabu@temp}%
+ <{##2\ifx$\tabu@Xmath$\fi}}%
+ }\tabu@rewritten
+}% \tabu@Xrewritten
+\def\tabu@hsize #1#2{%
+ \ifdim #2\p@<\z@
+ \ifdim \tabucolX=\maxdimen \tabu@wd{#1}\else
+ \ifdim \tabu@wd{#1}<-#2\tabucolX \tabu@wd{#1}\else -#2\tabucolX\fi
+ \fi
+ \else #2\tabucolX
+ \fi
+}% \tabu@hsize
+%% \usetabu and \preamble: rewriting process ---------------------
+\tabu@privatecolumntype \usetabu [1]{%
+ \ifx\\#1\\\tabu@saveerr{}\else
+ \@ifundefined{tabu@saved@\string#1}
+ {\tabu@saveerr{#1}}
+ {\let\tabu@rewriteX \tabu@rewriteXrestore
+ \csname tabu@saved@\string#1\expandafter\endcsname\expandafter\@ne}%
+ \fi
+}% \NC@rewrite@\usetabu
+\tabu@privatecolumntype \preamble [1]{%
+ \ifx\\#1\\\tabu@saveerr{}\else
+ \@ifundefined{tabu@saved@\string#1}
+ {\tabu@saveerr{#1}}
+ {\csname tabu@saved@\string#1\expandafter\endcsname\expandafter\z@}%
+ \fi
+}% \NC@rewrite@\preamble
+%% Controlling the rewriting process -------------------------------
+\tabu@newcolumntype \tabu@rewritefirst{%
+ \iftabu@long \aftergroup \tabu@longpream %
+ \else \aftergroup \tabu@pream
+ \fi
+ \let\tabu@ \relax \let\tabu@hsize \relax
+ \let\tabu@Xcoefs \@empty \let\tabu@savels \relax
+ \tabu@Xcol \z@ \tabu@cnt \tw@
+ \gdef\tabu@mkpreambuffer{\tabu@{}}\tabu@measuringfalse
+ \global\setbox\@arstrutbox \box\@arstrutbox
+ \NC@list{\NC@do *}\tabu@textbar \tabu@lines
+ \NC@list\expandafter{\the\NC@list \NC@do X}%
+ \iftabu@siunitx %
+ \NC@list\expandafter{\the\NC@list \NC@do S\NC@do s}\fi
+ \NC@list\expandafter{\the\expandafter\NC@list \tabu@highprioritycolumns}%
+ \expandafter\def\expandafter\tabu@NC@list\expandafter{%
+ \the\expandafter\NC@list \tabu@NC@list}% % * | X S
+ \NC@list\expandafter{\expandafter \NC@do \expandafter\usetabu
+ \expandafter \NC@do \expandafter\preamble
+ \the\NC@list \NC@do \tabu@rewritemiddle
+ \NC@do \tabu@rewritelast}%
+ \tabu@savedecl
+ \tabu@privatecolumns
+ \edef\tabu@prev{\the\@temptokena}\NC@find \tabu@rewritemiddle
+}% NC@rewrite@\tabu@rewritefirst
+\tabu@newcolumntype \tabu@rewritemiddle{%
+ \edef\tabu@temp{\the\@temptokena}\NC@find \tabu@rewritelast
+}% \NC@rewrite@\tabu@rewritemiddle
+\tabu@newcolumntype \tabu@rewritelast{%
+ \ifx \tabu@temp\tabu@prev \advance\tabu@cnt \m@ne
+ \NC@list\expandafter{\tabu@NC@list \NC@do \tabu@rewritemiddle
+ \NC@do \tabu@rewritelast}%
+ \else \let\tabu@prev\tabu@temp
+ \fi
+ \ifcase \tabu@cnt \expandafter\tabu@endrewrite
+ \else \expandafter\NC@find \expandafter\tabu@rewritemiddle
+ \fi
+}% \NC@rewrite@\tabu@rewritelast
+%% Choosing the strategy --------------------------------------------
+\def\tabu@endrewrite {%
+ \let\tabu@temp \NC@find
+ \ifx \@arrayright\relax \let\@arrayright \@empty \fi
+ \count@=%
+ \ifx \@finalstrut\tabu@finalstrut \z@ % outer in mode 0 print
+ \iftabu@measuring
+ \xdef\tabu@mkpreambuffer{\tabu@mkpreambuffer
+ \tabu@target \csname tabu@\the\tabu@nested.T\endcsname
+ \tabucolX \csname tabu@\the\tabu@nested.X\endcsname
+ \edef\@halignto {\ifx\@arrayright\@empty to\tabu@target\fi}}%
+ \fi
+ \else\iftabu@measuring 4 % X columns
+ \xdef\tabu@mkpreambuffer{\tabu@{\tabu@mkpreambuffer
+ \tabu@target \the\tabu@target
+ \tabu@spreadtarget \the\tabu@spreadtarget}%
+ \def\noexpand\tabu@Xcoefs{\tabu@Xcoefs}%
+ \edef\tabu@halignto{\ifx \@arrayright\@empty to\tabu@target\fi}}%
+ \let\tabu@Xcoefs \relax
+ \else\ifcase\tabu@nested \thr@@ % outer, no X
+ \global\let\tabu@afterendpar \relax
+ \else \@ne % inner, no X, outer in mode 1 or 2
+ \fi
+ \ifdefined\tabu@usetabu
+ \else \ifdim\tabu@target=\z@
+ \else \let\tabu@temp \tabu@extracolsep
+ \fi\fi
+ \fi
+ \fi
+ \xdef\tabu@mkpreambuffer{\count@ \the\count@ \tabu@mkpreambuffer}%
+ \tabu@temp
+}% \tabu@endrewrite
+\def\tabu@extracolsep{\@defaultunits \expandafter\let
+ \expandafter\tabu@temp \expandafter=\the\@temptokena \relax\@nnil
+ \ifx \tabu@temp\@sptoken
+ \expandafter\tabu@gobblespace \expandafter\tabu@extracolsep
+ \else
+ \edef\tabu@temp{\noexpand\NC@find
+ \if |\noexpand\tabu@temp @%
+ \else\if !\noexpand\tabu@temp @%
+ \else !%
+ \fi\fi
+ {\noexpand\extracolsep\noexpand\@flushglue}}%
+ \fi
+ \tabu@temp
+}% \tabu@extrac@lsep
+%% Implementing the strategy ----------------------------------------
+\long\def\tabu@pream #1\@preamble {%
+ \let\tabu@ \tabu@@ \tabu@mkpreambuffer \tabu@aftergroupcleanup
+ \NC@list\expandafter {\tabu@NC@list}% in case of nesting...
+ \ifdefined\tabu@usetabu \tabu@usetabu \tabu@target \z@ \fi
+ \let\tabu@savedpreamble \@preamble
+ \global\let\tabu@elapsedtime \relax
+ \tabu@thebody ={#1\tabu@aftergroupcleanup}%
+ \tabu@thebody =\expandafter{\the\expandafter\tabu@thebody
+ \@preamble}%
+ \edef\tabuthepreamble {\the\tabu@thebody}% ( no @ allowed for \scantokens )
+ \tabu@select
+}% \tabu@pream
+\long\def\tabu@longpream #1\LT@bchunk #2\LT@bchunk{%
+ \let\tabu@ \tabu@@ \tabu@mkpreambuffer \tabu@aftergroupcleanup
+ \NC@list\expandafter {\tabu@NC@list}% in case of nesting...
+ \let\tabu@savedpreamble \@preamble
+ \global\let\tabu@elapsedtime \relax
+ \tabu@thebody ={#1\LT@bchunk #2\tabu@aftergroupcleanup \LT@bchunk}%
+ \edef\tabuthepreamble {\the\tabu@thebody}% ( no @ allowed for \scantokens )
+ \tabu@select
+}% \tabu@longpream
+\def\tabu@select {%
+ \ifnum\tabu@nested>\z@ \tabuscantokensfalse \fi
+ \ifnum \count@=\@ne \iftabu@measuring \count@=\tw@ \fi\fi
+ \ifcase \count@
+ \global\let\tabu@elapsedtime \relax
+ \tabu@seteverycr
+ \expandafter \tabuthepreamble % vertical adjustment (inherited from outer)
+ \or % exit in vertical measure + struts per cell because no X and outer in mode 3
+ \tabu@evr{\tabu@verticalinit}\tabu@celllalign@def{\tabu@verticalmeasure}%
+ \def\tabu@cellralign{\tabu@verticalspacing}%
+ \tabu@seteverycr
+ \expandafter \tabuthepreamble
+ \or % exit without measure because no X and outer in mode 4
+ \tabu@evr{}\tabu@celllalign@def{}\let\tabu@cellralign \@empty
+ \tabu@seteverycr
+ \expandafter \tabuthepreamble
+ \else % needs trials
+ \tabu@evr{}\tabu@celllalign@def{}\let\tabu@cellralign \@empty
+ \tabu@savecounters
+ \expandafter \tabu@setstrategy
+ \fi
+}% \tabu@select
+\def\tabu@@ {\gdef\tabu@mkpreambuffer}
+%% Protections to set up before trials ------------------------------
+\def\tabu@setstrategy {\begingroup %
+ \tabu@trialh@@k \tabu@cnt \z@ % number of trials
+ \hbadness \@M \let\hbadness \@tempcnta
+ \hfuzz \maxdimen \let\hfuzz \@tempdima
+ \let\write \tabu@nowrite\let\GenericError \tabu@GenericError
+ \let\savetabu \@gobble \let\tabudefaulttarget \linewidth
+ \let\@footnotetext \@gobble \let\@xfootnote \tabu@xfootnote
+ \let\color \tabu@nocolor\let\rowcolor \tabu@norowcolor
+ \let\tabu@aftergroupcleanup \relax % only after the last trial
+ \tabu@mkpreambuffer
+ \ifnum \count@>\thr@@ \let\@halignto \@empty \tabucolX@init
+ \def\tabu@lasttry{\m@ne\p@}\fi
+ \begingroup \iffalse{\fi \ifnum0=`}\fi
+ \toks@{}\def\tabu@stack{b}\iftabuscantokens \endlinechar=10 \obeyspaces \fi %
+ \tabu@collectbody \tabu@strategy %
+}% \tabu@setstrategy
+\def\tabu@savecounters{%
+ \def\@elt ##1{\csname c@##1\endcsname\the\csname c@##1\endcsname}%
+ \edef\tabu@clckpt {\begingroup \globaldefs=\@ne \cl@@ckpt \endgroup}\let\@elt \relax
+}% \tabu@savecounters
+\def\tabucolX@init {% \tabucolX <= \tabu@target / (sum coefs > 0)
+ \dimen@ \z@ \tabu@Xsum \z@ \tabucolX \z@ \let\tabu@ \tabu@Xinit \tabu@Xcoefs
+ \ifdim \dimen@>\z@
+ \@tempdima \dimexpr \tabu@target *\p@/\dimen@ + \tabu@hfuzz\relax
+ \ifdim \tabucolX<\@tempdima \tabucolX \@tempdima \fi
+ \fi
+}% \tabucolX@init
+\def\tabu@Xinit #1#2{\tabu@Xcol #1 \advance \tabu@Xsum
+ \ifdim #2\p@>\z@ #2\p@ \advance\dimen@ #2\p@
+ \else -#2\p@ \tabu@negcoeftrue
+ \@tempdima \dimexpr \tabu@target*\p@/\dimexpr-#2\p@\relax \relax
+ \ifdim \tabucolX<\@tempdima \tabucolX \@tempdima \fi
+ \tabu@wddef{#1}{0pt}%
+ \fi
+}% \tabu@Xinit
+%% Collecting the environment body ----------------------------------
+\long\def\tabu@collectbody #1#2\end #3{%
+ \edef\tabu@stack{\tabu@pushbegins #2\begin\end\expandafter\@gobble\tabu@stack}%
+ \ifx \tabu@stack\@empty
+ \toks@\expandafter{\expandafter\tabu@thebody\expandafter{\the\toks@ #2}%
+ \def\tabu@end@envir{\end{#3}}%
+ \iftabuscantokens
+ \iftabu@long \def\tabu@endenvir {\end{#3}\tabu@gobbleX}%
+ \else \def\tabu@endenvir {\let\endarray \@empty
+ \end{#3}\tabu@gobbleX}%
+ \fi
+ \else \def\tabu@endenvir {\end{#3}}\fi}%
+ \let\tabu@collectbody \tabu@endofcollect
+ \else\def\tabu@temp{#3}%
+ \ifx \tabu@temp\@empty \toks@\expandafter{\the\toks@ #2\end }%
+ \else \ifx\tabu@temp\tabu@@spxiii \toks@\expandafter{\the\toks@ #2\end #3}%
+ \else \ifx\tabu@temp\tabu@X \toks@\expandafter{\the\toks@ #2\end #3}%
+ \else \toks@\expandafter{\the\toks@ #2\end{#3}}%
+ \fi\fi\fi
+ \fi
+ \tabu@collectbody{#1}%
+}% \tabu@collectbody
+\long\def\tabu@pushbegins#1\begin#2{\ifx\end#2\else b\expandafter\tabu@pushbegins\fi}%
+\def\tabu@endofcollect #1{\ifnum0=`{}\fi
+ \expandafter\endgroup \the\toks@ #1%
+}% \tabu@endofcollect
+%% The trials: switching between strategies -------------------------
+\def\tabu@strategy {\relax % stops \count@ assignment !
+ \ifcase\count@ % case 0 = print with vertical adjustment (outer is finished)
+ \expandafter \tabu@endoftrials
+ \or % case 1 = exit in vertical measure (outer in mode 3)
+ \expandafter\xdef\csname tabu@\the\tabu@nested.T\endcsname{\the\tabu@target}%
+ \expandafter\xdef\csname tabu@\the\tabu@nested.X\endcsname{\the\tabucolX}%
+ \expandafter \tabu@endoftrials
+ \or % case 2 = exit with a rule replacing the table (outer in mode 4)
+ \expandafter \tabu@quickend
+ \or % case 3 = outer is in mode 3 because of no X
+ \begingroup
+ \tabu@evr{\tabu@verticalinit}\tabu@celllalign@def{\tabu@verticalmeasure}%
+ \def\tabu@cellralign{\tabu@verticalspacing}%
+ \expandafter \tabu@measuring
+ \else % case 4 = horizontal measure
+ \begingroup
+ \global\let\tabu@elapsedtime \tabu@message@etime
+ \long\def\multicolumn##1##2##3{\multispan{##1}}%
+ \let\tabu@startpboxORI \@startpbox
+ \iftabu@spread
+ \def\tabu@naturalXmax {\z@}%
+ \let\tabu@naturalXmin \tabu@naturalXmax
+ \tabu@evr{\global\tabu@naturalX \z@}%
+ \let\@startpbox \tabu@startpboxmeasure
+ \else\iftabu@negcoef
+ \let\@startpbox \tabu@startpboxmeasure
+ \else \let\@startpbox \tabu@startpboxquick
+ \fi\fi
+ \expandafter \tabu@measuring
+ \fi
+}% \tabu@strategy
+\def\tabu@measuring{\expandafter \tabu@trial \expandafter
+ \count@ \the\count@ \tabu@endtrial
+}% \tabu@measuring
+\def\tabu@trial{\iftabu@long \tabu@longtrial \else \tabu@shorttrial \fi}
+\def\tabu@shorttrial {\setbox\tabu@box \hbox\bgroup \tabu@seteverycr
+ \ifx \tabu@savecounters\relax \else
+ \let\tabu@savecounters \relax \tabu@clckpt \fi
+ $\iftabuscantokens \tabu@rescan \else \expandafter\@secondoftwo \fi
+ \expandafter{\expandafter \tabuthepreamble
+ \the\tabu@thebody
+ \csname tabu@adl@endtrial\endcsname
+ \endarray}$\egroup % got \tabu@box
+}% \tabu@shorttrial
+\def\tabu@longtrial {\setbox\tabu@box \hbox\bgroup \tabu@seteverycr
+ \ifx \tabu@savecounters\relax \else
+ \let\tabu@savecounters \relax \tabu@clckpt \fi
+ \iftabuscantokens \tabu@rescan \else \expandafter\@secondoftwo \fi
+ \expandafter{\expandafter \tabuthepreamble
+ \the\tabu@thebody
+ \tabuendlongtrial}\egroup % got \tabu@box
+}% \tabu@longtrial
+\def\tabuendlongtrial{% no @ allowed for \scantokens
+ \LT@echunk \global\setbox\@ne \hbox{\unhbox\@ne}\kern\wd\@ne
+ \LT@get@widths
+}% \tabuendlongtrial
+\def\tabu@adl@endtrial{%
+ \crcr \noalign{\global\adl@ncol \tabu@nbcols}}% anything global is crap, junky and fails !
+\def\tabu@seteverycr {\tabu@reset
+ \everycr \expandafter{\the\everycr \tabu@everycr}%
+ \let\everycr \tabu@noeverycr %
+}% \tabu@seteverycr
+\def\tabu@noeverycr{{\aftergroup\tabu@restoreeverycr \afterassignment}\toks@}
+\def\tabu@restoreeverycr {\let\everycr \tabu@@everycr}
+\def\tabu@everycr {\iftabu@everyrow \noalign{\tabu@everyrow}\fi}
+\def\tabu@endoftrials {%
+ \iftabuscantokens \expandafter\@firstoftwo
+ \else \expandafter\@secondoftwo
+ \fi
+ {\expandafter \tabu@closetrialsgroup \expandafter
+ \tabu@rescan \expandafter{%
+ \expandafter\tabuthepreamble
+ \the\expandafter\tabu@thebody
+ \iftabu@long \else \endarray \fi}}
+ {\expandafter\tabu@closetrialsgroup \expandafter
+ \tabuthepreamble
+ \the\tabu@thebody}%
+ \tabu@endenvir % Finish !
+}% \tabu@endoftrials
+\def\tabu@closetrialsgroup {%
+ \toks@\expandafter{\tabu@endenvir}%
+ \edef\tabu@bufferX{\endgroup
+ \tabucolX \the\tabucolX
+ \tabu@target \the\tabu@target
+ \tabu@cnt \the\tabu@cnt
+ \def\noexpand\tabu@endenvir{\the\toks@}%
+ %Quid de \@halignto = \tabu@halignto ??
+ }% \tabu@bufferX
+ \tabu@bufferX
+ \ifcase\tabu@nested % print out (outer in mode 0)
+ \global\tabu@cnt \tabu@cnt
+ \tabu@evr{\tabu@verticaldynamicadjustment}%
+ \tabu@celllalign@def{\everypar{}}\let\tabu@cellralign \@empty
+ \let\@finalstrut \tabu@finalstrut
+ \else % vertical measure of nested tabu
+ \tabu@evr{\tabu@verticalinit}%
+ \tabu@celllalign@def{\tabu@verticalmeasure}%
+ \def\tabu@cellralign{\tabu@verticalspacing}%
+ \fi
+ \tabu@clckpt \let\@halignto \tabu@halignto
+ \let\@halignto \@empty
+ \tabu@seteverycr
+ \ifdim \tabustrutrule>\z@ \ifnum\tabu@nested=\z@
+ \setbox\@arstrutbox \box\voidb@x % force \@arstrutbox to be rebuilt (visible struts)
+ \fi\fi
+}% \tabu@closetrialsgroup
+\def\tabu@quickend {\expandafter \endgroup \expandafter
+ \tabu@target \the\tabu@target \tabu@quickrule
+ \let\endarray \relax \tabu@endenvir
+}% \tabu@quickend
+\def\tabu@endtrial {\relax % stops \count@ assignment !
+ \ifcase \count@ \tabu@err % case 0 = impossible here
+ \or \tabu@err % case 1 = impossible here
+ \or \tabu@err % case 2 = impossible here
+ \or % case 3 = outer goes into mode 0
+ \def\tabu@bufferX{\endgroup}\count@ \z@
+ \else % case 4 = outer goes into mode 3
+ \iftabu@spread \tabu@spreadarith % inner into mode 1 (outer in mode 3)
+ \else \tabu@arith % or 2 (outer in mode 4)
+ \fi
+ \count@=%
+ \ifcase\tabu@nested \thr@@ % outer goes into mode 3
+ \else\iftabu@measuring \tw@ % outer is in mode 4
+ \else \@ne % outer is in mode 3
+ \fi\fi
+ \edef\tabu@bufferX{\endgroup
+ \tabucolX \the\tabucolX
+ \tabu@target \the\tabu@target}%
+ \fi
+ \expandafter \tabu@bufferX \expandafter
+ \count@ \the\count@ \tabu@strategy
+}% \tabu@endtrial
+\def\tabu@err{\errmessage{(tabu) Internal impossible error! (\count@=\the\count@)}}
+%% The algorithms: compute the widths / stop or go on ---------------
+\def\tabu@arithnegcoef {%
+ \@tempdima \z@ \dimen@ \z@ \let\tabu@ \tabu@arith@negcoef \tabu@Xcoefs
+}% \tabu@arithnegcoef
+\def\tabu@arith@negcoef #1#2{%
+ \ifdim #2\p@>\z@ \advance\dimen@ #2\p@ % saturated by definition
+ \advance\@tempdima #2\tabucolX
+ \else
+ \ifdim -#2\tabucolX <\tabu@wd{#1}% c_i X < natural width <= \tabu@target-> saturated
+ \advance\dimen@ -#2\p@
+ \advance\@tempdima -#2\tabucolX
+ \else
+ \advance\@tempdima \tabu@wd{#1}% natural width <= c_i X => neutralised
+ \ifdim \tabu@wd{#1}<\tabu@target \else % neutralised
+ \advance\dimen@ -#2\p@ % saturated (natural width = tabu@target)
+ \fi
+ \fi
+ \fi
+}% \tabu@arith@negcoef
+\def\tabu@givespace #1#2{% here \tabu@DELTA < \z@
+ \ifdim \@tempdima=\z@
+ \tabu@wddef{#1}{\the\dimexpr -\tabu@DELTA*\p@/\tabu@Xsum}%
+ \else
+ \tabu@wddef{#1}{\the\dimexpr \tabu@hsize{#1}{#2}
+ *(\p@ -\tabu@DELTA*\p@/\@tempdima)/\p@\relax}%
+ \fi
+}% \tabu@givespace
+\def\tabu@arith {\advance\tabu@cnt \@ne
+ \ifnum \tabu@cnt=\@ne \tabu@message{\tabu@titles}\fi
+ \tabu@arithnegcoef
+ \@tempdimb \dimexpr \wd\tabu@box -\@tempdima \relax %
+ \tabu@DELTA = \dimexpr \wd\tabu@box - \tabu@target \relax
+ \tabu@message{\tabu@message@arith}%
+ \ifdim \tabu@DELTA <\tabu@hfuzz
+ \ifdim \tabu@DELTA<\z@ % wd (tabu)<\tabu@target ?
+ \let\tabu@ \tabu@givespace \tabu@Xcoefs
+ \advance\@tempdima \@tempdimb \advance\@tempdima -\tabu@DELTA % for message
+ \else % already converged: nothing to do but nearly impossible...
+ \fi
+ \tabucolX \maxdimen
+ \tabu@measuringfalse
+ \else % need for narrower X columns
+ \tabucolX =\dimexpr (\@tempdima -\tabu@DELTA) *\p@/\tabu@Xsum \relax
+ \tabu@measuringtrue
+ \@whilesw \iftabu@measuring\fi {%
+ \advance\tabu@cnt \@ne
+ \tabu@arithnegcoef
+ \tabu@DELTA =\dimexpr \@tempdima+\@tempdimb -\tabu@target \relax % always < 0 here
+ \tabu@message{\tabu@header
+ \tabu@msgalign \tabucolX { }{ }{ }{ }{ }\@@
+ \tabu@msgalign \@tempdima+\@tempdimb { }{ }{ }{ }{ }\@@
+ \tabu@msgalign \tabu@target { }{ }{ }{ }{ }\@@
+ \tabu@msgalign@PT \dimen@ { }{}{}{}{}{}{}\@@
+ \ifdim -\tabu@DELTA<\tabu@hfuzz \tabu@spaces target ok\else
+ \tabu@msgalign \dimexpr -\tabu@DELTA *\p@/\dimen@ {}{}{}{}{}\@@
+ \fi}%
+ \ifdim -\tabu@DELTA<\tabu@hfuzz
+ \advance\@tempdima \@tempdimb % for message
+ \tabu@measuringfalse
+ \else
+ \advance\tabucolX \dimexpr -\tabu@DELTA *\p@/\dimen@ \relax
+ \fi
+ }%
+ \fi
+ \tabu@message{\tabu@message@reached}%
+ \edef\tabu@bufferX{\endgroup \tabu@cnt \the\tabu@cnt
+ \tabucolX \the\tabucolX
+ \tabu@target \the\tabu@target}%
+}% \tabu@arith
+\def\tabu@spreadarith {%
+ \dimen@ \z@ \@tempdima \tabu@naturalXmax \let\tabu@ \tabu@spread@arith \tabu@Xcoefs
+ \edef\tabu@naturalXmin {\the\dimexpr\tabu@naturalXmin*\dimen@/\p@}%
+ \@tempdimc =\dimexpr \wd\tabu@box -\tabu@naturalXmax+\tabu@naturalXmin \relax
+ \iftabu@measuring
+ \tabu@target =\dimexpr \@tempdimc+\tabu@spreadtarget \relax
+ \edef\tabu@bufferX{\endgroup \tabucolX \the\tabucolX \tabu@target\the\tabu@target}%
+ \else
+ \tabu@message{\tabu@message@spreadarith}%
+ \ifdim \dimexpr \@tempdimc+\tabu@spreadtarget >\tabu@target
+ \tabu@message{(tabu) spread
+ \ifdim \@tempdimc>\tabu@target useless here: default target used%
+ \else too large: reduced to fit default target\fi.}%
+ \else
+ \tabu@target =\dimexpr \@tempdimc+\tabu@spreadtarget \relax
+ \tabu@message{(tabu) spread: New target set to \the\tabu@target^^J}%
+ \fi
+ \begingroup \let\tabu@wddef \@gobbletwo
+ \@tempdimb \@tempdima
+ \tabucolX@init
+ \tabu@arithnegcoef
+ \wd\tabu@box =\dimexpr \wd\tabu@box +\@tempdima-\@tempdimb \relax
+ \expandafter\endgroup \expandafter\tabucolX \the\tabucolX
+ \tabu@arith
+ \fi
+}% \tabu@spreadarith
+\def\tabu@spread@arith #1#2{%
+ \ifdim #2\p@>\z@ \advance\dimen@ #2\p@
+ \else \advance\@tempdima \tabu@wd{#1}\relax
+ \fi
+}% \tabu@spread@arith
+%% Reporting in the .log file ---------------------------------------
+\def\tabu@message@defaulttarget{%
+ \ifnum\tabu@nested=\z@^^J(tabu) Default target:
+ \ifx\tabudefaulttarget\linewidth \string\linewidth
+ \ifdim \tabu@thetarget=\linewidth \else
+ -\the\dimexpr\linewidth-\tabu@thetarget\fi =
+ \else\ifx\tabudefaulttarget\linegoal\string\linegoal=
+ \fi\fi
+ \else (tabu) Default target (nested): \fi
+ \the\tabu@target \on@line
+ \ifnum\tabu@nested=\z@ , page \the\c@page\fi}
+\def\tabu@message@target {^^J(tabu) Target specified:
+ \the\tabu@target \on@line, page \the\c@page}
+\def\tabu@message@arith {\tabu@header
+ \tabu@msgalign \tabucolX { }{ }{ }{ }{ }\@@
+ \tabu@msgalign \wd\tabu@box { }{ }{ }{ }{ }\@@
+ \tabu@msgalign \tabu@target { }{ }{ }{ }{ }\@@
+ \tabu@msgalign@PT \dimen@ { }{}{}{}{}{}{}\@@
+ \ifdim \tabu@DELTA<\tabu@hfuzz giving space\else
+ \tabu@msgalign \dimexpr (\@tempdima-\tabu@DELTA) *\p@/\tabu@Xsum -\tabucolX {}{}{}{}{}\@@
+ \fi
+}% \tabu@message@arith
+\def\tabu@message@spreadarith {\tabu@spreadheader
+ \tabu@msgalign \tabu@spreadtarget { }{ }{ }{ }{}\@@
+ \tabu@msgalign \wd\tabu@box { }{ }{ }{ }{}\@@
+ \tabu@msgalign -\tabu@naturalXmax { }{}{}{}{}\@@
+ \tabu@msgalign \tabu@naturalXmin { }{ }{ }{ }{}\@@
+ \tabu@msgalign \ifdim \dimexpr\@tempdimc>\tabu@target \tabu@target
+ \else \@tempdimc+\tabu@spreadtarget \fi
+ {}{}{}{}{}\@@}
+\def\tabu@message@negcoef #1#2{
+ \tabu@spaces\tabu@spaces\space * #1. X[\rem@pt#2]:
+ \space width = \tabu@wd {#1}
+ \expandafter\string\csname tabu@\the\tabu@nested.W\number#1\endcsname
+ \ifdim -\tabu@pt#2\tabucolX<\tabu@target
+ < \number-\rem@pt#2 X
+ = \the\dimexpr -\tabu@pt#2\tabucolX \relax
+ \else
+ <= \the\tabu@target\space < \number-\rem@pt#2 X\fi}
+\def\tabu@message@reached{\tabu@header
+ ******* Reached Target:
+ hfuzz = \tabu@hfuzz\on@line\space *******}
+\def\tabu@message@etime{\edef\tabu@stoptime{\the\pdfelapsedtime}%
+ \tabu@message{(tabu)\tabu@spaces Time elapsed during measure:
+ \the\numexpr(\tabu@stoptime-\tabu@starttime-32767)/65536\relax sec
+ \the\numexpr\numexpr(\tabu@stoptime-\tabu@starttime)
+ -\numexpr(\tabu@stoptime-\tabu@starttime-32767)/65536\relax*65536\relax
+ *1000/65536\relax ms \tabu@spaces(\the\tabu@cnt\space
+ cycle\ifnum\tabu@cnt>\@ne s\fi)^^J^^J}}
+\def\tabu@message@verticalsp {%
+ \ifdim \@tempdima>\tabu@ht
+ \ifdim \@tempdimb>\tabu@dp
+ \expandafter\expandafter\expandafter\string\tabu@ht =
+ \tabu@msgalign \@tempdima { }{ }{ }{ }{ }\@@
+ \expandafter\expandafter\expandafter\string\tabu@dp =
+ \tabu@msgalign \@tempdimb { }{ }{ }{ }{ }\@@^^J%
+ \else
+ \expandafter\expandafter\expandafter\string\tabu@ht =
+ \tabu@msgalign \@tempdima { }{ }{ }{ }{ }\@@^^J%
+ \fi
+ \else\ifdim \@tempdimb>\tabu@dp
+ \tabu@spaces\tabu@spaces\tabu@spaces
+ \expandafter\expandafter\expandafter\string\tabu@dp =
+ \tabu@msgalign \@tempdimb { }{ }{ }{ }{ }\@@^^J\fi
+ \fi
+}% \tabu@message@verticalsp
+\edef\tabu@spaces{\@spaces}
+\def\tabu@strippt{\expandafter\tabu@pt\the}
+{\@makeother\P \@makeother\T\lowercase{\gdef\tabu@pt #1PT{#1}}}
+\def\tabu@msgalign{\expandafter\tabu@msg@align\the\dimexpr}
+\def\tabu@msgalign@PT{\expandafter\tabu@msg@align\romannumeral-`\0\tabu@strippt}
+\def\do #1{%
+ \def\tabu@msg@align##1.##2##3##4##5##6##7##8##9\@@{%
+ \ifnum##1<10 #1 #1\else
+ \ifnum##1<100 #1 \else
+ \ifnum##1<\@m #1\fi\fi\fi
+ ##1.##2##3##4##5##6##7##8#1}%
+ \def\tabu@header{(tabu) \ifnum\tabu@cnt<10 #1\fi\the\tabu@cnt) }%
+ \def\tabu@titles{\ifnum \tabu@nested=\z@
+ (tabu) Try#1 #1 tabu X #1 #1 #1tabu Width #1 #1 Target
+ #1 #1 #1 Coefs #1 #1 #1 Update^^J\fi}%
+ \def\tabu@spreadheader{%
+ (tabu) Try#1 #1 Spread #1 #1 tabu Width #1 #1 #1 Nat. X #1 #1 #1 #1Nat. Min.
+ #1 New Target^^J%
+ (tabu) sprd}
+ \def\tabu@message@save {\begingroup
+ \def\x ####1{\tabu@msg@align ####1{ }{ }{ }{ }{}\@@}
+ \def\z ####1{\expandafter\x\expandafter{\romannumeral-`\0\tabu@strippt
+ \dimexpr####1\p@{ }{ }}}%
+ \let\color \relax \def\tabu@rulesstyle ####1####2{\detokenize{####1}}%
+ \let\CT@arc@ \relax \let\@preamble \@gobble
+ \let\tabu@savedpream \@firstofone
+ \let\tabu@savedparams \@firstofone
+ \def\tabu@target ####1\relax {(tabu) target #1 #1 #1 #1 #1 = \x{####1}^^J}%
+ \def\tabucolX ####1\relax {(tabu) X columns width#1 = \x{####1}^^J}%
+ \def\tabu@nbcols ####1\relax {(tabu) Number of columns: \z{####1}^^J}%
+ \def\tabu@aligndefault ####1{(tabu) Default alignment: #1 #1 ####1^^J}%
+ \def\col@sep ####1\relax {(tabu) column sep #1 #1 #1 = \x{####1}^^J}%
+ \def\arrayrulewidth ####1\relax{(tabu) arrayrulewidth #1 = \x{####1}}%
+ \def\doublerulesep ####1\relax { doublerulesep = \x{####1}^^J}%
+ \def\extratabsurround####1\relax{(tabu) extratabsurround = \x{####1}^^J}%
+ \def\extrarowheight ####1\relax{(tabu) extrarowheight #1 = \x{####1}}%
+ \def\extrarowdepth ####1\relax {extrarowdepth = \x{####1}^^J}%
+ \def\abovetabulinesep####1\relax{(tabu) abovetabulinesep=\x{####1} }%
+ \def\belowtabulinesep####1\relax{ belowtabulinesep=\x{####1}^^J}%
+ \def\arraystretch ####1{(tabu) arraystretch #1 #1 = \z{####1}^^J}%
+ \def\minrowclearance####1\relax{(tabu) minrowclearance #1 = \x{####1}^^J}%
+ \def\tabu@arc@L ####1{(tabu) taburulecolor #1 #1 = ####1^^J}%
+ \def\tabu@drsc@L ####1{(tabu) tabudoublerulecolor= ####1^^J}%
+ \def\tabu@evr@L ####1{(tabu) everyrow #1 #1 #1 #1 = \detokenize{####1}^^J}%
+ \def\tabu@ls@L ####1{(tabu) line style = \detokenize{####1}^^J}%
+ \def\NC@find ####1\@nil{(tabu) tabu preamble#1 #1 = \detokenize{####1}^^J}%
+ \def\tabu@wddef####1####2{(tabu) Natural width ####1 = \x{####2}^^J}%
+ \let\edef \@gobbletwo \let\def \@empty \let\let \@gobbletwo
+ \tabu@message{%
+ (tabu) \string\savetabu{\tabu@temp}: \on@line^^J%
+ \tabu@usetabu \@nil^^J}%
+ \endgroup}
+}\do{ }
+%% Measuring the natural width (varwidth) - store the results -------
+\def\tabu@startpboxmeasure #1{\bgroup % entering \vtop
+ \edef\tabu@temp{\expandafter\@secondoftwo \ifx\tabu@hsize #1\else\relax\fi}%
+ \ifodd 1\ifx \tabu@temp\@empty 0 \else % starts with \tabu@hsize ?
+ \iftabu@spread \else % if spread -> measure
+ \ifdim \tabu@temp\p@>\z@ 0 \fi\fi\fi% if coef>0 -> do not measure
+ \let\@startpbox \tabu@startpboxORI % restore immediately (nesting)
+ \tabu@measuringtrue % for the quick option...
+ \tabu@Xcol =\expandafter\@firstoftwo\ifx\tabu@hsize #1\fi
+ \ifdim \tabu@temp\p@>\z@ \ifdim \tabu@temp\tabucolX<\tabu@target
+ \tabu@target=\tabu@temp\tabucolX \fi\fi
+ \setbox\tabu@box \hbox \bgroup
+ \begin{varwidth}\tabu@target
+ \let\FV@ListProcessLine \tabu@FV@ListProcessLine % \hbox to natural width...
+ \narrowragged \arraybackslash \parfillskip \@flushglue
+ \ifdefined\pdfadjustspacing \pdfadjustspacing\z@ \fi
+ \bgroup \aftergroup\tabu@endpboxmeasure
+ \ifdefined \cellspacetoplimit \tabu@cellspacepatch \fi
+ \else \expandafter\@gobble
+ \tabu@startpboxquick{#1}% \@gobble \bgroup
+ \fi
+}% \tabu@startpboxmeasure
+\def\tabu@cellspacepatch{\def\bcolumn##1\@nil{}\let\ecolumn\@empty
+ \bgroup\color@begingroup}
+\def\tabu@endpboxmeasure {%
+ \@finalstrut \@arstrutbox
+ \end{varwidth}\egroup %
+ \ifdim \tabu@temp\p@ <\z@ % neg coef
+ \ifdim \tabu@wd\tabu@Xcol <\wd\tabu@box
+ \tabu@wddef\tabu@Xcol {\the\wd\tabu@box}%
+ \tabu@debug{\tabu@message@endpboxmeasure}%
+ \fi
+ \else % spread coef>0
+ \global\advance \tabu@naturalX \wd\tabu@box
+ \@tempdima =\dimexpr \wd\tabu@box *\p@/\dimexpr \tabu@temp\p@\relax \relax
+ \ifdim \tabu@naturalXmax <\tabu@naturalX
+ \xdef\tabu@naturalXmax {\the\tabu@naturalX}\fi
+ \ifdim \tabu@naturalXmin <\@tempdima
+ \xdef\tabu@naturalXmin {\the\@tempdima}\fi
+ \fi
+ \box\tabu@box \egroup % end of \vtop (measure) restore \tabu@target
+}% \tabu@endpboxmeasure
+\def\tabu@wddef #1{\expandafter\xdef
+ \csname tabu@\the\tabu@nested.W\number#1\endcsname}
+\def\tabu@wd #1{\csname tabu@\the\tabu@nested.W\number#1\endcsname}
+\def\tabu@message@endpboxmeasure{\tabu@spaces\tabu@spaces<-> % <-> save natural wd
+ \the\tabu@Xcol. X[\tabu@temp]:
+ target = \the\tabucolX \space
+ \expandafter\expandafter\expandafter\string\tabu@wd\tabu@Xcol
+ =\tabu@wd\tabu@Xcol
+}% \tabu@message@endpboxmeasure
+\def\tabu@startpboxquick {\bgroup
+ \let\@startpbox \tabu@startpboxORI % restore immediately
+ \let\tabu \tabu@quick % \begin is expanded before...
+ \expandafter\@gobble \@startpbox % gobbles \bgroup
+}% \tabu@startpboxquick
+\def\tabu@quick {\begingroup \iffalse{\fi \ifnum0=`}\fi
+ \toks@{}\def\tabu@stack{b}\tabu@collectbody \tabu@endquick
+}% \tabu@quick
+\def\tabu@endquick {%
+ \ifodd 1\ifx\tabu@end@envir\tabu@endtabu \else
+ \ifx\tabu@end@envir\tabu@endtabus \else 0\fi\fi\relax
+ \endgroup
+ \else \let\endtabu \relax
+ \tabu@end@envir
+ \fi
+}% \tabu@quick
+\def\tabu@endtabu {\end{tabu}}
+\def\tabu@endtabus {\end{tabu*}}
+%% Measuring the heights and depths - store the results -------------
+\def\tabu@verticalmeasure{\everypar{}%
+ \ifnum \currentgrouptype>12 % 14=semi-simple, 15=math shift group
+ \setbox\tabu@box =\hbox\bgroup
+ \let\tabu@verticalspacing \tabu@verticalsp@lcr
+ \d@llarbegin % after \hbox ...
+ \else
+ \edef\tabu@temp{\ifnum\currentgrouptype=5\vtop
+ \else\ifnum\currentgrouptype=12\vcenter
+ \else\vbox\fi\fi}%
+ \setbox\tabu@box \hbox\bgroup$\tabu@temp \bgroup
+ \let\tabu@verticalspacing \tabu@verticalsp@pmb
+ \fi
+}% \tabu@verticalmeasure
+\def\tabu@verticalsp@lcr{%
+ \d@llarend \egroup %
+ \@tempdima \dimexpr \ht\tabu@box+\abovetabulinesep
+ \@tempdimb \dimexpr \dp\tabu@box+\belowtabulinesep \relax
+ \ifdim\tabustrutrule>\z@ \tabu@debug{\tabu@message@verticalsp}\fi
+ \ifdim \tabu@ht<\@tempdima \tabu@htdef{\the\@tempdima}\fi
+ \ifdim \tabu@dp<\@tempdimb \tabu@dpdef{\the\@tempdimb}\fi
+ \noindent\vrule height\@tempdima depth\@tempdimb
+}% \tabu@verticalsp@lcr
+\def\tabu@verticalsp@pmb{% inserts struts as needed
+ \par \expandafter\egroup
+ \expandafter$\expandafter
+ \egroup \expandafter
+ \@tempdimc \the\prevdepth
+ \@tempdima \dimexpr \ht\tabu@box+\abovetabulinesep
+ \@tempdimb \dimexpr \dp\tabu@box+\belowtabulinesep \relax
+ \ifdim\tabustrutrule>\z@ \tabu@debug{\tabu@message@verticalsp}\fi
+ \ifdim \tabu@ht<\@tempdima \tabu@htdef{\the\@tempdima}\fi
+ \ifdim \tabu@dp<\@tempdimb \tabu@dpdef{\the\@tempdimb}\fi
+ \let\@finalstrut \@gobble
+ \hrule height\@tempdima depth\@tempdimb width\hsize
+%% \box\tabu@box
+}% \tabu@verticalsp@pmb
+
+\def\tabu@verticalinit{%
+ \ifnum \c@taburow=\z@ \tabu@rearstrut \fi % after \tabu@reset !
+ \advance\c@taburow \@ne
+ \tabu@htdef{\the\ht\@arstrutbox}\tabu@dpdef{\the\dp\@arstrutbox}%
+ \advance\c@taburow \m@ne
+}% \tabu@verticalinit
+\def\tabu@htdef {\expandafter\xdef \csname tabu@\the\tabu@nested.H\the\c@taburow\endcsname}
+\def\tabu@ht {\csname tabu@\the\tabu@nested.H\the\c@taburow\endcsname}
+\def\tabu@dpdef {\expandafter\xdef \csname tabu@\the\tabu@nested.D\the\c@taburow\endcsname}
+\def\tabu@dp {\csname tabu@\the\tabu@nested.D\the\c@taburow\endcsname}
+\def\tabu@verticaldynamicadjustment {%
+ \advance\c@taburow \@ne
+ \extrarowheight \dimexpr\tabu@ht - \ht\strutbox
+ \extrarowdepth \dimexpr\tabu@dp - \dp\strutbox
+ \let\arraystretch \@empty
+ \advance\c@taburow \m@ne
+}% \tabu@verticaldynamicadjustment
+\def\tabuphantomline{\crcr \noalign{%
+ {\globaldefs \@ne
+ \setbox\@arstrutbox \box\voidb@x
+ \let\tabu@@celllalign \tabu@celllalign
+ \let\tabu@@cellralign \tabu@cellralign
+ \let\tabu@@cellleft \tabu@cellleft
+ \let\tabu@@cellright \tabu@cellright
+ \let\tabu@@thevline \tabu@thevline
+ \let\tabu@celllalign \@empty
+ \let\tabu@cellralign \@empty
+ \let\tabu@cellright \@empty
+ \let\tabu@cellleft \@empty
+ \let\tabu@thevline \relax}%
+ \edef\tabu@temp{\tabu@multispan \tabu@nbcols{\noindent &}}%
+ \toks@\expandafter{\tabu@temp \noindent\tabu@everyrowfalse \cr
+ \noalign{\tabu@rearstrut
+ {\globaldefs\@ne
+ \let\tabu@celllalign \tabu@@celllalign
+ \let\tabu@cellralign \tabu@@cellralign
+ \let\tabu@cellleft \tabu@@cellleft
+ \let\tabu@cellright \tabu@@cellright
+ \let\tabu@thevline \tabu@@thevline}}}%
+ \expandafter}\the\toks@
+}% \tabuphantomline
+%% \firsthline and \lasthline corrections ---------------------------
+\def\tabu@firstline {\tabu@hlineAZ \tabu@firsthlinecorrection {}}
+\def\tabu@firsthline{\tabu@hlineAZ \tabu@firsthlinecorrection \hline}
+\def\tabu@lastline {\tabu@hlineAZ \tabu@lasthlinecorrection {}}
+\def\tabu@lasthline {\tabu@hlineAZ \tabu@lasthlinecorrection \hline}
+\def\tabu@hline {% replaces \hline if no colortbl (see \AtBeginDocument)
+ \noalign{\ifnum0=`}\fi
+ {\CT@arc@\hrule height\arrayrulewidth}%
+ \futurelet \tabu@temp \tabu@xhline
+}% \tabu@hline
+\def\tabu@xhline{%
+ \ifx \tabu@temp \hline
+ {\ifx \CT@drsc@\relax \vskip
+ \else\ifx \CT@drsc@\@empty \vskip
+ \else \CT@drsc@\hrule height
+ \fi\fi
+ \doublerulesep}%
+ \fi
+ \ifnum0=`{\fi}%
+}% \tabu@xhline
+\def\tabu@hlineAZ #1#2{\noalign{\ifnum0=`}\fi \dimen@ \z@ \count@ \z@
+ \toks@{}\def\tabu@hlinecorrection{#1}\def\tabu@temp{#2}%
+ \tabu@hlineAZsurround
+}% \tabu@hlineAZ
+\newcommand*\tabu@hlineAZsurround[1][\extratabsurround]{%
+ \extratabsurround #1\let\tabucline \tabucline@scan
+ \let\hline \tabu@hlinescan \let\firsthline \hline
+ \let\cline \tabu@clinescan \let\lasthline \hline
+ \expandafter \futurelet \expandafter \tabu@temp
+ \expandafter \tabu@nexthlineAZ \tabu@temp
+}% \tabu@hlineAZsurround
+\def\tabu@hlinescan {\tabu@thick \arrayrulewidth \tabu@xhlineAZ \hline}
+\def\tabu@clinescan #1{\tabu@thick \arrayrulewidth \tabu@xhlineAZ {\cline{#1}}}
+\def\tabucline@scan{\@testopt \tabucline@sc@n {}}
+\def\tabucline@sc@n #1[#2]{\tabu@xhlineAZ {\tabucline[{#1}]{#2}}}
+\def\tabu@nexthlineAZ{%
+ \ifx \tabu@temp\hline \else
+ \ifx \tabu@temp\cline \else
+ \ifx \tabu@temp\tabucline \else
+ \tabu@hlinecorrection
+ \fi\fi\fi
+}% \tabu@nexthlineAZ
+\def\tabu@xhlineAZ #1{%
+ \toks@\expandafter{\the\toks@ #1}%
+ \@tempdimc \tabu@thick % The last line width
+ \ifcase\count@ \@tempdimb \tabu@thick % The first line width
+ \else \advance\dimen@ \dimexpr \tabu@thick+\doublerulesep \relax
+ \fi
+ \advance\count@ \@ne \futurelet \tabu@temp \tabu@nexthlineAZ
+}% \tabu@xhlineAZ
+\def\tabu@firsthlinecorrection{% \count@ = number of \hline -1
+ \@tempdima \dimexpr \ht\@arstrutbox+\dimen@
+ \edef\firsthline{%
+ \omit \hbox to\z@{\hss{\noexpand\tabu@DBG{yellow}\vrule
+ height \the\dimexpr\@tempdima+\extratabsurround
+ depth \dp\@arstrutbox
+ width \tabustrutrule}\hss}\cr
+ \noalign{\vskip -\the\dimexpr \@tempdima+\@tempdimb
+ +\dp\@arstrutbox \relax}%
+ \the\toks@
+ }\ifnum0=`{\fi
+ \expandafter}\firsthline % we are then !
+}% \tabu@firsthlinecorrection
+\def\tabu@lasthlinecorrection{%
+ \@tempdima \dimexpr \dp\@arstrutbox+\dimen@+\@tempdimb+\@tempdimc
+ \edef\lasthline{%
+ \the\toks@
+ \noalign{\vskip -\the\dimexpr\dimen@+\@tempdimb+\dp\@arstrutbox}%
+ \omit \hbox to\z@{\hss{\noexpand\tabu@DBG{yellow}\vrule
+ depth \the\dimexpr \dp\@arstrutbox+\@tempdimb+\dimen@
+ +\extratabsurround-\@tempdimc
+ height \z@
+ width \tabustrutrule}\hss}\cr
+ }\ifnum0=`{\fi
+ \expandafter}\lasthline % we are then !
+}% \tabu@lasthlinecorrection
+\def\tabu@LT@@hline{%
+ \ifx\LT@next\hline
+ \global\let\LT@next \@gobble
+ \ifx \CT@drsc@\relax
+ \gdef\CT@LT@sep{%
+ \noalign{\penalty-\@medpenalty\vskip\doublerulesep}}%
+ \else
+ \gdef\CT@LT@sep{%
+ \multispan\LT@cols{%
+ \CT@drsc@\leaders\hrule\@height\doublerulesep\hfill}\cr}%
+ \fi
+ \else
+ \global\let\LT@next\empty
+ \gdef\CT@LT@sep{%
+ \noalign{\penalty-\@lowpenalty\vskip-\arrayrulewidth}}%
+ \fi
+ \ifnum0=`{\fi}%
+ \multispan\LT@cols
+ {\CT@arc@\leaders\hrule\@height\arrayrulewidth\hfill}\cr
+ \CT@LT@sep
+ \multispan\LT@cols
+ {\CT@arc@\leaders\hrule\@height\arrayrulewidth\hfill}\cr
+ \noalign{\penalty\@M}%
+ \LT@next
+}% \tabu@LT@@hline
+%% Horizontal lines : \tabucline ------------------------------------
+\let\tabu@start \@tempcnta
+\let\tabu@stop \@tempcntb
+\newcommand*\tabucline{\noalign{\ifnum0=`}\fi \tabu@cline}
+\newcommand*\tabu@cline[2][]{\tabu@startstop{#2}%
+ \ifnum \tabu@stop<\z@ \toks@{}%
+ \else \tabu@clinearg{#1}\tabu@thestyle
+ \edef\tabucline{\toks@{%
+ \ifnum \tabu@start>\z@ \omit
+ \tabu@multispan\tabu@start {\span\omit}&\fi
+ \omit \tabu@multispan\tabu@stop {\span\omit}%
+ \tabu@thehline\cr
+ }}\tabucline
+ \tabu@tracinglines{(tabu:tabucline) Style: #1^^J\the\toks@^^J^^J}%
+ \fi
+ \futurelet \tabu@temp \tabu@xcline
+}% \tabu@cline
+\def\tabu@clinearg #1{%
+ \ifx\\#1\\\let\tabu@thestyle \tabu@ls@
+ \else \@defaultunits \expandafter\let\expandafter\@tempa
+ \romannumeral-`\0#1\relax \@nnil
+ \ifx \hbox\@tempa \tabu@clinebox{#1}%
+ \else\ifx \box\@tempa \tabu@clinebox{#1}%
+ \else\ifx \vbox\@tempa \tabu@clinebox{#1}%
+ \else\ifx \vtop\@tempa \tabu@clinebox{#1}%
+ \else\ifx \copy\@tempa \tabu@clinebox{#1}%
+ \else\ifx \leaders\@tempa \tabu@clineleads{#1}%
+ \else\ifx \cleaders\@tempa \tabu@clineleads{#1}%
+ \else\ifx \xleaders\@tempa \tabu@clineleads{#1}%
+ \else\tabu@getline {#1}%
+ \fi\fi\fi\fi\fi\fi\fi\fi
+ \fi
+}% \tabu@clinearg
+\def\tabu@clinebox #1{\tabu@clineleads{\xleaders#1\hss}}
+\def\tabu@clineleads #1{%
+ \let\tabu@thestyle \relax \let\tabu@leaders \@undefined
+ \gdef\tabu@thehrule{#1}}
+\def\tabu@thehline{\begingroup
+ \ifdefined\tabu@leaders
+ \noexpand\tabu@thehleaders
+ \else \noexpand\tabu@thehrule
+ \fi \endgroup
+}% \tabu@thehline
+\def\tabu@xcline{%
+ \ifx \tabu@temp\tabucline
+ \toks@\expandafter{\the\toks@ \noalign
+ {\ifx\CT@drsc@\relax \vskip
+ \else \CT@drsc@\hrule height
+ \fi
+ \doublerulesep}}%
+ \fi
+ \tabu@docline
+}% \tabu@xcline
+\def\tabu@docline {\ifnum0=`{\fi \expandafter}\the\toks@}
+\def\tabu@docline@evr {\xdef\tabu@doclineafter{\the\toks@}%
+ \ifnum0=`{\fi}\aftergroup\tabu@doclineafter}
+\def\tabu@multispan #1#2{%
+ \ifnum\numexpr#1>\@ne #2\expandafter\tabu@multispan
+ \else \expandafter\@gobbletwo
+ \fi {#1-1}{#2}%
+}% \tabu@multispan
+\def\tabu@startstop #1{\tabu@start@stop #1\relax 1-\tabu@nbcols \@nnil}
+\def\tabu@start@stop #1-#2\@nnil{%
+ \@defaultunits \tabu@start\number 0#1\relax \@nnil
+ \@defaultunits \tabu@stop \number 0#2\relax \@nnil
+ \tabu@stop \ifnum \tabu@start>\tabu@nbcols \m@ne
+ \else\ifnum \tabu@stop=\z@ \tabu@nbcols
+ \else\ifnum \tabu@stop>\tabu@nbcols \tabu@nbcols
+ \else \tabu@stop
+ \fi\fi\fi
+ \advance\tabu@start \m@ne
+ \ifnum \tabu@start>\z@ \advance\tabu@stop -\tabu@start \fi
+}% \tabu@start@stop
+%% Numbers: siunitx S columns (and \tabudecimal) -------------------
+\def\tabu@tabudecimal #1{%
+ \def\tabu@decimal{#1}\@temptokena{}%
+ \let\tabu@getdecimal@ \tabu@getdecimal@ignorespaces
+ \tabu@scandecimal
+}% \tabu@tabudecimal
+\def\tabu@scandecimal{\futurelet \tabu@temp \tabu@getdecimal@}
+\def\tabu@skipdecimal#1{#1\tabu@scandecimal}
+\def\tabu@getdecimal@ignorespaces{%
+ \ifcase 0\ifx\tabu@temp\ignorespaces\else
+ \ifx\tabu@temp\@sptoken1\else
+ 2\fi\fi\relax
+ \let\tabu@getdecimal@ \tabu@getdecimal
+ \expandafter\tabu@skipdecimal
+ \or \expandafter\tabu@gobblespace\expandafter\tabu@scandecimal
+ \else \expandafter\tabu@skipdecimal
+ \fi
+}% \tabu@getdecimal@ignorespaces
+\def\tabu@get@decimal#1{\@temptokena\expandafter{\the\@temptokena #1}%
+ \tabu@scandecimal}
+\def\do#1{%
+ \def\tabu@get@decimalspace#1{%
+ \@temptokena\expandafter{\the\@temptokena #1}\tabu@scandecimal}%
+}\do{ }
+\let\tabu@@tabudecimal \tabu@tabudecimal
+\def\tabu@getdecimal{%
+ \ifcase 0\ifx 0\tabu@temp\else
+ \ifx 1\tabu@temp\else
+ \ifx 2\tabu@temp\else
+ \ifx 3\tabu@temp\else
+ \ifx 4\tabu@temp\else
+ \ifx 5\tabu@temp\else
+ \ifx 6\tabu@temp\else
+ \ifx 7\tabu@temp\else
+ \ifx 8\tabu@temp\else
+ \ifx 9\tabu@temp\else
+ \ifx .\tabu@temp\else
+ \ifx ,\tabu@temp\else
+ \ifx -\tabu@temp\else
+ \ifx +\tabu@temp\else
+ \ifx e\tabu@temp\else
+ \ifx E\tabu@temp\else
+ \ifx\tabu@cellleft\tabu@temp1\else
+ \ifx\ignorespaces\tabu@temp1\else
+ \ifx\@sptoken\tabu@temp2\else
+ 3\fi\fi\fi\fi\fi\fi\fi\fi\fi\fi\fi\fi\fi\fi\fi\fi\fi\fi\fi\relax
+ \expandafter\tabu@get@decimal
+ \or \expandafter\tabu@skipdecimal
+ \or \expandafter\tabu@get@decimalspace
+ \else\expandafter\tabu@printdecimal
+ \fi
+}% \tabu@getdecimal
+\def\tabu@printdecimal{%
+ \edef\tabu@temp{\the\@temptokena}%
+ \ifx\tabu@temp\@empty\else
+ \ifx\tabu@temp\space\else
+ \expandafter\tabu@decimal\expandafter{\the\@temptokena}%
+ \fi\fi
+}% \tabu@printdecimal
+%% Verbatim inside X columns ----------------------------------------
+\def\tabu@verbatim{%
+ \let\verb \tabu@verb
+ \let\FV@DefineCheckEnd \tabu@FV@DefineCheckEnd
+}% \tabu@verbatim
+\let\tabu@ltx@verb \verb
+\def\tabu@verb{\@ifstar {\tabu@ltx@verb*} \tabu@ltx@verb}
+\def\tabu@fancyvrb {%
+ \def\tabu@FV@DefineCheckEnd ##1{%
+ \def\tabu@FV@DefineCheckEnd{%
+ ##1%
+ \let\FV@CheckEnd \tabu@FV@CheckEnd
+ \let\FV@@CheckEnd \tabu@FV@@CheckEnd
+ \let\FV@@@CheckEnd \tabu@FV@@@CheckEnd
+ \edef\FV@EndScanning{%
+ \def\noexpand\next{\noexpand\end{\FV@EnvironName}}%
+ \global\let\noexpand\FV@EnvironName\relax
+ \noexpand\next}%
+ \xdef\FV@EnvironName{\detokenize\expandafter{\FV@EnvironName}}}%
+ }\expandafter\tabu@FV@DefineCheckEnd\expandafter{\FV@DefineCheckEnd}
+}% \tabu@fancyvrb
+\def\tabu@FV@CheckEnd #1{\expandafter\FV@@CheckEnd \detokenize{#1\end{}}\@nil}
+\edef\tabu@FV@@@CheckEnd {\detokenize{\end{}}}
+\begingroup
+\catcode`\[1 \catcode`\]2
+\@makeother\{ \@makeother\}
+ \edef\x[\endgroup
+ \def\noexpand\tabu@FV@@CheckEnd ##1\detokenize[\end{]##2\detokenize[}]##3%
+ ]\x \@nil{\def\@tempa{#2}\def\@tempb{#3}}
+\def\tabu@FV@ListProcessLine #1{%
+ \hbox {%to \hsize{%
+ \kern\leftmargin
+ \hbox {%to \linewidth{%
+ \FV@LeftListNumber
+ \FV@LeftListFrame
+ \FancyVerbFormatLine{#1}\hss
+%% DG/SR modification begin - Jan. 28, 1998 (for numbers=right add-on)
+%% \FV@RightListFrame}%
+ \FV@RightListFrame
+ \FV@RightListNumber}%
+%% DG/SR modification end
+ \hss}}
+%% \savetabu --------------------------------------------------------
+\newcommand*\savetabu[1]{\noalign{%
+ \tabu@sanitizearg{#1}\tabu@temp
+ \ifx \tabu@temp\@empty \tabu@savewarn{}{The tabu will not be saved}\else
+ \@ifundefined{tabu@saved@\tabu@temp}{}{\tabu@savewarn{#1}{Overwriting}}%
+ \ifdefined\tabu@restored \expandafter\let
+ \csname tabu@saved@\tabu@temp \endcsname \tabu@restored
+ \else {\tabu@save}%
+ \fi
+ \fi}%
+}% \savetabu
+\def\tabu@save {%
+ \toks0\expandafter{\tabu@saved@}%
+ \iftabu@negcoef
+ \let\tabu@wddef \relax \let\tabu@ \tabu@savewd \edef\tabu@savewd{\tabu@Xcoefs}%
+ \toks0\expandafter{\the\toks\expandafter0\tabu@savewd}\fi
+ \toks1\expandafter{\tabu@savedpream}%
+ \toks2\expandafter{\tabu@savedpreamble}%
+ \let\@preamble \relax
+ \let\tabu@savedpream \relax \let\tabu@savedparams \relax
+ \edef\tabu@preamble{%
+ \def\noexpand\tabu@aligndefault{\tabu@align}%
+ \def\tabu@savedparams {\noexpand\the\toks0}%
+ \def\tabu@savedpream {\noexpand\the\toks1}}%
+ \edef\tabu@usetabu{%
+ \def\@preamble {\noexpand\the\toks2}%
+ \tabu@target \the\tabu@target \relax
+ \tabucolX \the\tabucolX \relax
+ \tabu@nbcols \the\tabu@nbcols \relax
+ \def\noexpand\tabu@aligndefault{\tabu@align}%
+ \def\tabu@savedparams {\noexpand\the\toks0}%
+ \def\tabu@savedpream {\noexpand\the\toks1}}%
+ \let\tabu@aligndefault \relax \let\@sharp \relax
+ \edef\@tempa{\noexpand\tabu@s@ved
+ {\tabu@usetabu}
+ {\tabu@preamble}
+ {\the\toks1}}\@tempa
+ \tabu@message@save
+}% \tabu@save
+\long\def\tabu@s@ved #1#2#3{%
+ \def\tabu@usetabu{#1}%
+ \expandafter\gdef\csname tabu@saved@\tabu@temp\endcsname ##1{%
+ \ifodd ##1% \usetabu
+ \tabu@measuringfalse \tabu@spreadfalse % Just in case...
+ \gdef\tabu@usetabu {%
+ \ifdim \tabu@target>\z@ \tabu@warn@usetabu \fi
+ \global\let\tabu@usetabu \@undefined
+ \def\@halignto {to\tabu@target}%
+ #1%
+ \ifx \tabu@align\tabu@aligndefault@text
+ \ifnum \tabu@nested=\z@
+ \let\tabu@align \tabu@aligndefault \fi\fi}%
+ \else % \preamble
+ \gdef\tabu@preamble {%
+ \global\let\tabu@preamble \@undefined
+ #2%
+ \ifx \tabu@align\tabu@aligndefault@text
+ \ifnum \tabu@nested=\z@
+ \let\tabu@align \tabu@aligndefault \fi\fi}%
+ \fi
+ #3}%
+}% \tabu@s@ved
+\def\tabu@aligndefault@text {\tabu@aligndefault}%
+\def\tabu@warn@usetabu {\PackageWarning{tabu}
+ {Specifying a target with \string\usetabu\space is useless
+ \MessageBreak The target cannot be changed!}}
+\def\tabu@savewd #1#2{\ifdim #2\p@<\z@ \tabu@wddef{#1}{\tabu@wd{#1}}\fi}
+\def\tabu@savewarn#1#2{\PackageInfo{tabu}
+ {User-name `#1' already used for \string\savetabu
+ \MessageBreak #2}}%
+\def\tabu@saveerr#1{\PackageError{tabu}
+ {User-name `#1' is unknown for \string\usetabu
+ \MessageBreak I cannot restore an unknown preamble!}\@ehd}
+%% \rowfont ---------------------------------------------------------
+\newskip \tabu@cellskip
+\def\tabu@rowfont{\ifdim \baselineskip=\z@\noalign\fi
+ {\ifnum0=`}\fi \tabu@row@font}
+\newcommand*\tabu@row@font[2][]{%
+ \ifnum7=\currentgrouptype
+ \global\let\tabu@@cellleft \tabu@cellleft
+ \global\let\tabu@@cellright \tabu@cellright
+ \global\let\tabu@@celllalign \tabu@celllalign
+ \global\let\tabu@@cellralign \tabu@cellralign
+ \global\let\tabu@@rowfontreset\tabu@rowfontreset
+ \fi
+ \global\let\tabu@rowfontreset \tabu@rowfont@reset
+ \expandafter\gdef\expandafter\tabu@cellleft\expandafter{\tabu@cellleft #2}%
+ \ifcsname tabu@cell@#1\endcsname % row alignment
+ \csname tabu@cell@#1\endcsname \fi
+ \ifnum0=`{\fi}% end of group / noalign group
+}% \rowfont
+\def\tabu@ifcolorleavevmode #1{\let\color \tabu@leavevmodecolor #1\let\color\tabu@color}%
+\def\tabu@rowfont@reset{%
+ \global\let\tabu@rowfontreset \tabu@@rowfontreset
+ \global\let\tabu@cellleft \tabu@@cellleft
+ \global\let\tabu@cellright \tabu@@cellright
+ \global\let\tabu@cellfont \@empty
+ \global\let\tabu@celllalign \tabu@@celllalign
+ \global\let\tabu@cellralign \tabu@@cellralign
+}% \tabu@@rowfontreset
+\let\tabu@rowfontreset \@empty % overwritten \AtBeginDocument if colortbl
+%% \tabu@prepnext@tok -----------------------------------------------
+\newif \iftabu@cellright
+\def\tabu@prepnext@tok{%
+ \ifnum \count@<\z@ %
+ \@tempcnta \@M %
+ \tabu@nbcols\z@
+ \let\tabu@fornoopORI \@fornoop
+ \tabu@cellrightfalse
+ \else
+ \ifcase \numexpr \count@-\@tempcnta \relax % (case 0): prev. token is left
+ \advance \tabu@nbcols \@ne
+ \iftabu@cellright % before-previous token is right and is finished
+ \tabu@cellrightfalse %
+ \tabu@righttok
+ \fi
+ \tabu@lefttok
+ \or % (case 1) previous token is right
+ \tabu@cellrighttrue \let\@fornoop \tabu@lastnoop
+ \else % special column: do not change the token
+ \iftabu@cellright % before-previous token is right
+ \tabu@cellrightfalse
+ \tabu@righttok
+ \fi
+ \fi % \ifcase
+ \fi
+ \tabu@prepnext@tokORI
+}% \tabu@prepnext@tok
+\long\def\tabu@lastnoop#1\@@#2#3{\tabu@lastn@@p #2\@nextchar \in@\in@@}
+\def\tabu@lastn@@p #1\@nextchar #2#3\in@@{%
+ \ifx \in@#2\else
+ \let\@fornoop \tabu@fornoopORI
+ \xdef\tabu@mkpreambuffer{\tabu@nbcols\the\tabu@nbcols \tabu@mkpreambuffer}%
+ \toks0\expandafter{\expandafter\tabu@everyrowtrue \the\toks0}%
+ \expandafter\prepnext@tok
+ \fi
+}% \tabu@lastnoop
+\def\tabu@righttok{%
+ \advance \count@ \m@ne
+ \toks\count@\expandafter {\the\toks\count@ \tabu@cellright \tabu@cellralign}%
+ \advance \count@ \@ne
+}% \tabu@righttok
+\def\tabu@lefttok{\toks\count@\expandafter{\expandafter\tabu@celllalign
+ \the\toks\count@ \tabu@cellleft}% after because of $
+}% \tabu@lefttok
+%% Neutralisation of glues ------------------------------------------
+\let\tabu@cellleft \@empty
+\let\tabu@cellright \@empty
+\tabu@celllalign@def{\tabu@cellleft}%
+\let\tabu@cellralign \@empty
+\def\tabu@cell@align #1#2#3{%
+ \let\tabu@maybesiunitx \toks@ \tabu@celllalign
+ \global \expandafter \tabu@celllalign@def \expandafter {\the\toks@ #1}%
+ \toks@\expandafter{\tabu@cellralign #2}%
+ \xdef\tabu@cellralign{\the\toks@}%
+ \toks@\expandafter{\tabu@cellleft #3}%
+ \xdef\tabu@cellleft{\the\toks@}%
+}% \tabu@cell@align
+\def\tabu@cell@l{% force alignment to left
+ \tabu@cell@align
+ {\tabu@removehfil \raggedright \tabu@cellleft}% left
+ {\tabu@flush1\tabu@ignorehfil}% right
+ \raggedright
+}% \tabu@cell@l
+\def\tabu@cell@c{% force alignment to center
+ \tabu@cell@align
+ {\tabu@removehfil \centering \tabu@flush{.5}\tabu@cellleft}
+ {\tabu@flush{.5}\tabu@ignorehfil}
+ \centering
+}% \tabu@cell@c
+\def\tabu@cell@r{% force alignment to right
+ \tabu@cell@align
+ {\tabu@removehfil \raggedleft \tabu@flush1\tabu@cellleft}
+ \tabu@ignorehfil
+ \raggedleft
+}% \tabu@cell@r
+\def\tabu@cell@j{% force justification (for p, m, b columns)
+ \tabu@cell@align
+ {\tabu@justify\tabu@cellleft}
+ {}
+ \tabu@justify
+}% \tabu@cell@j
+\def\tabu@justify{%
+ \leftskip\z@skip \@rightskip\leftskip \rightskip\@rightskip
+ \parfillskip\@flushglue
+}% \tabu@justify
+%% ragged2e settings
+\def\tabu@cell@L{% force alignment to left (ragged2e)
+ \tabu@cell@align
+ {\tabu@removehfil \RaggedRight \tabu@cellleft}
+ {\tabu@flush 1\tabu@ignorehfil}
+ \RaggedRight
+}% \tabu@cell@L
+\def\tabu@cell@C{% force alignment to center (ragged2e)
+ \tabu@cell@align
+ {\tabu@removehfil \Centering \tabu@flush{.5}\tabu@cellleft}
+ {\tabu@flush{.5}\tabu@ignorehfil}
+ \Centering
+}% \tabu@cell@C
+\def\tabu@cell@R{% force alignment to right (ragged2e)
+ \tabu@cell@align
+ {\tabu@removehfil \RaggedLeft \tabu@flush 1\tabu@cellleft}
+ \tabu@ignorehfil
+ \RaggedLeft
+}% \tabu@cell@R
+\def\tabu@cell@J{% force justification (ragged2e)
+ \tabu@cell@align
+ {\justifying \tabu@cellleft}
+ {}
+ \justifying
+}% \tabu@cell@J
+\def\tabu@flush#1{%
+ \iftabu@colortbl % colortbl uses \hfill rather than \hfil
+ \hskip \ifnum13<\currentgrouptype \stretch{#1}%
+ \else \ifdim#1pt<\p@ \tabu@cellskip
+ \else \stretch{#1}
+ \fi\fi \relax
+ \else % array.sty
+ \ifnum 13<\currentgrouptype
+ \hfil \hskip1sp \relax \fi
+ \fi
+}% \tabu@flush
+\let\tabu@hfil \hfil
+\let\tabu@hfill \hfill
+\let\tabu@hskip \hskip
+\def\tabu@removehfil{%
+ \iftabu@colortbl
+ \unkern \tabu@cellskip =\lastskip
+ \ifnum\gluestretchorder\tabu@cellskip =\tw@ \hskip-\tabu@cellskip
+ \else \tabu@cellskip \z@skip
+ \fi
+ \else
+ \ifdim\lastskip=1sp\unskip\fi
+ \ifnum\gluestretchorder\lastskip =\@ne
+ \hfilneg % \hfilneg for array.sty but not for colortbl...
+ \fi
+ \fi
+}% \tabu@removehfil
+\def\tabu@ignorehfil{\aftergroup \tabu@nohfil}
+\def\tabu@nohfil{% \hfil -> do nothing + restore original \hfil
+ \def\hfil{\let\hfil \tabu@hfil}% local to (alignment template) group
+}% \tabu@nohfil
+\def\tabu@colortblalignments {% if colortbl
+ \def\tabu@nohfil{%
+ \def\hfil {\let\hfil \tabu@hfil}% local to (alignment template) group
+ \def\hfill {\let\hfill \tabu@hfill}% (colortbl uses \hfill) pfff...
+ \def\hskip ####1\relax{\let\hskip \tabu@hskip}}% local
+}% \tabu@colortblalignments
+%% Taking care of footnotes and hyperfootnotes ----------------------
+\long\def\tabu@footnotetext #1{%
+ \edef\@tempa{\the\tabu@footnotes
+ \noexpand\footnotetext [\the\csname c@\@mpfn\endcsname]}%
+ \global\tabu@footnotes\expandafter{\@tempa {#1}}}%
+\long\def\tabu@xfootnotetext [#1]#2{%
+ \global\tabu@footnotes\expandafter{\the\tabu@footnotes
+ \footnotetext [{#1}]{#2}}}
+\let\tabu@xfootnote \@xfootnote
+\long\def\tabu@Hy@ftntext{\tabu@Hy@ftntxt {\the \c@footnote }}
+\long\def\tabu@Hy@xfootnote [#1]{%
+ \begingroup
+ \value\@mpfn #1\relax
+ \protected@xdef \@thefnmark {\thempfn}%
+ \endgroup
+ \@footnotemark \tabu@Hy@ftntxt {#1}%
+}% \tabu@Hy@xfootnote
+\long\def\tabu@Hy@ftntxt #1#2{%
+ \edef\@tempa{%
+ \the\tabu@footnotes
+ \begingroup
+ \value\@mpfn #1\relax
+ \noexpand\protected@xdef\noexpand\@thefnmark {\noexpand\thempfn}%
+ \expandafter \noexpand \expandafter
+ \tabu@Hy@footnotetext \expandafter{\Hy@footnote@currentHref}%
+ }%
+ \global\tabu@footnotes\expandafter{\@tempa {#2}%
+ \endgroup}%
+}% \tabu@Hy@ftntxt
+\long\def\tabu@Hy@footnotetext #1#2{%
+ \H@@footnotetext{%
+ \ifHy@nesting
+ \hyper@@anchor {#1}{#2}%
+ \else
+ \Hy@raisedlink{%
+ \hyper@@anchor {#1}{\relax}%
+ }%
+ \def\@currentHref {#1}%
+ \let\@currentlabelname \@empty
+ #2%
+ \fi
+ }%
+}% \tabu@Hy@footnotetext
+%% No need for \arraybackslash ! ------------------------------------
+\def\tabu@latextwoe {%
+\def\tabu@temp##1##2##3{{\toks@\expandafter{##2##3}\xdef##1{\the\toks@}}}
+\tabu@temp \tabu@centering \centering \arraybackslash
+\tabu@temp \tabu@raggedleft \raggedleft \arraybackslash
+\tabu@temp \tabu@raggedright \raggedright \arraybackslash
+}% \tabu@latextwoe
+\def\tabu@raggedtwoe {%
+\def\tabu@temp ##1##2##3{{\toks@\expandafter{##2##3}\xdef##1{\the\toks@}}}
+\tabu@temp \tabu@Centering \Centering \arraybackslash
+\tabu@temp \tabu@RaggedLeft \RaggedLeft \arraybackslash
+\tabu@temp \tabu@RaggedRight \RaggedRight \arraybackslash
+\tabu@temp \tabu@justifying \justifying \arraybackslash
+}% \tabu@raggedtwoe
+\def\tabu@normalcrbackslash{\let\\\@normalcr}
+\def\tabu@trivlist{\expandafter\def\expandafter\@trivlist\expandafter{%
+ \expandafter\tabu@normalcrbackslash \@trivlist}}
+%% Utilities: \fbox \fcolorbox and \tabudecimal -------------------
+\def\tabu@fbox {\leavevmode\afterassignment\tabu@beginfbox \setbox\@tempboxa\hbox}
+\def\tabu@beginfbox {\bgroup \kern\fboxsep
+ \bgroup\aftergroup\tabu@endfbox}
+\def\tabu@endfbox {\kern\fboxsep\egroup\egroup
+ \@frameb@x\relax}
+\def\tabu@color@b@x #1#2{\leavevmode \bgroup
+ \def\tabu@docolor@b@x{#1{#2\color@block{\wd\z@}{\ht\z@}{\dp\z@}\box\z@}}%
+ \afterassignment\tabu@begincolor@b@x \setbox\z@ \hbox
+}% \tabu@color@b@x
+\def\tabu@begincolor@b@x {\kern\fboxsep \bgroup
+ \aftergroup\tabu@endcolor@b@x \set@color}
+\def\tabu@endcolor@b@x {\kern\fboxsep \egroup
+ \dimen@\ht\z@ \advance\dimen@ \fboxsep \ht\z@ \dimen@
+ \dimen@\dp\z@ \advance\dimen@ \fboxsep \dp\z@ \dimen@
+ \tabu@docolor@b@x \egroup
+}% \tabu@endcolor@b@x
+%% Corrections (arydshln, delarray, colortbl) -----------------------
+\def\tabu@fix@arrayright {%% \@arrayright is missing from \endarray
+ \iftabu@colortbl
+ \ifdefined\adl@array %
+ \def\tabu@endarray{%
+ \adl@endarray \egroup \adl@arrayrestore \CT@end \egroup %
+ \@arrayright %
+ \gdef\@preamble{}}%
+ \else %
+ \def\tabu@endarray{%
+ \crcr \egroup \egroup %
+ \@arrayright %
+ \gdef\@preamble{}\CT@end}%
+ \fi
+ \else
+ \ifdefined\adl@array %
+ \def\tabu@endarray{%
+ \adl@endarray \egroup \adl@arrayrestore \egroup %
+ \@arrayright %
+ \gdef\@preamble{}}%
+ \else %
+ \PackageWarning{tabu}
+ {\string\@arrayright\space is missing from the
+ \MessageBreak definition of \string\endarray.
+ \MessageBreak Compatibility with delarray.sty is broken.}%
+ \fi\fi
+}% \tabu@fix@arrayright
+\def\tabu@adl@xarraydashrule #1#2#3{%
+ \ifnum\@lastchclass=\adl@class@start\else
+ \ifnum\@lastchclass=\@ne\else
+ \ifnum\@lastchclass=5 \else % @-arg (class 5) and !-arg (class 1)
+ \adl@leftrulefalse \fi\fi % must be treated the same
+ \fi
+ \ifadl@zwvrule\else \ifadl@inactive\else
+ \@addtopreamble{\vrule\@width\arrayrulewidth
+ \@height\z@ \@depth\z@}\fi \fi
+ \ifadl@leftrule
+ \@addtopreamble{\adl@vlineL{\CT@arc@}{\adl@dashgapcolor}%
+ {\number#1}#3}%
+ \else \@addtopreamble{\adl@vlineR{\CT@arc@}{\adl@dashgapcolor}%
+ {\number#2}#3}
+ \fi
+}% \tabu@adl@xarraydashrule
+\def\tabu@adl@act@endpbox {%
+ \unskip \ifhmode \nobreak \fi \@finalstrut \@arstrutbox
+ \egroup \egroup
+ \adl@colhtdp \box\adl@box \hfil
+}% \tabu@adl@act@endpbox
+\def\tabu@adl@fix {%
+ \let\adl@xarraydashrule \tabu@adl@xarraydashrule % arydshln
+ \let\adl@act@endpbox \tabu@adl@act@endpbox % arydshln
+ \let\adl@act@@endpbox \tabu@adl@act@endpbox % arydshln
+ \let\@preamerror \@preamerr % arydshln
+}% \tabu@adl@fix
+%% Correction for longtable' \@startbox definition ------------------
+%% => \everypar is ``missing'' : TeX should be in vertical mode
+\def\tabu@LT@startpbox #1{%
+ \bgroup
+ \let\@footnotetext\LT@p@ftntext
+ \setlength\hsize{#1}%
+ \@arrayparboxrestore
+ \everypar{%
+ \vrule \@height \ht\@arstrutbox \@width \z@
+ \everypar{}}%
+}% \tabu@LT@startpbox
+%% \tracingtabu and the package options ------------------
+\DeclareOption{delarray}{\AtEndOfPackage{\RequirePackage{delarray}}}
+\DeclareOption{linegoal}{%
+ \AtEndOfPackage{%
+ \RequirePackage{linegoal}[2010/12/07]%
+ \let\tabudefaulttarget \linegoal% \linegoal is \linewidth if not pdfTeX
+}}
+\DeclareOption{scantokens}{\tabuscantokenstrue}
+\DeclareOption{debugshow}{\AtEndOfPackage{\tracingtabu=\tw@}}
+\def\tracingtabu {\begingroup\@ifnextchar=%
+ {\afterassignment\tabu@tracing\count@}
+ {\afterassignment\tabu@tracing\count@1\relax}}
+\def\tabu@tracing{\expandafter\endgroup
+ \expandafter\tabu@tr@cing \the\count@ \relax
+}% \tabu@tracing
+\def\tabu@tr@cing #1\relax {%
+ \ifnum#1>\thr@@ \let\tabu@tracinglines\message
+ \else \let\tabu@tracinglines\@gobble
+ \fi
+ \ifnum#1>\tw@ \let\tabu@DBG \tabu@@DBG
+ \def\tabu@mkarstrut {\tabu@DBG@arstrut}%
+ \tabustrutrule 1.5\p@
+ \else \let\tabu@DBG \@gobble
+ \def\tabu@mkarstrut {\tabu@arstrut}%
+ \tabustrutrule \z@
+ \fi
+ \ifnum#1>\@ne \let\tabu@debug \message
+ \else \let\tabu@debug \@gobble
+ \fi
+ \ifnum#1>\z@
+ \let\tabu@message \message
+ \let\tabu@tracing@save \tabu@message@save
+ \let\tabu@starttimer \tabu@pdftimer
+ \else
+ \let\tabu@message \@gobble
+ \let\tabu@tracing@save \@gobble
+ \let\tabu@starttimer \relax
+ \fi
+}% \tabu@tr@cing
+%% Setup \AtBeginDocument
+\AtBeginDocument{\tabu@AtBeginDocument}
+\def\tabu@AtBeginDocument{\let\tabu@AtBeginDocument \@undefined
+ \ifdefined\arrayrulecolor \tabu@colortbltrue %
+ \tabu@colortblalignments % different glues are used
+ \else \tabu@colortblfalse \fi
+ \ifdefined\CT@arc@ \else \let\CT@arc@ \relax \fi
+ \ifdefined\CT@drsc@\else \let\CT@drsc@ \relax \fi
+ \let\tabu@arc@L \CT@arc@ \let\tabu@drsc@L \CT@drsc@
+ \ifodd 1\ifcsname siunitx_table_collect_begin:Nn\endcsname %
+ \expandafter\ifx
+ \csname siunitx_table_collect_begin:Nn\endcsname\relax 0\fi\fi\relax
+ \tabu@siunitxtrue
+ \else \let\tabu@maybesiunitx \@firstofone %
+ \let\tabu@siunitx \tabu@nosiunitx
+ \tabu@siunitxfalse
+ \fi
+ \ifdefined\adl@array %
+ \else \let\tabu@adl@fix \relax
+ \let\tabu@adl@endtrial \@empty \fi
+ \ifdefined\longtable %
+ \else \let\longtabu \tabu@nolongtabu \fi
+ \ifdefined\cellspacetoplimit \tabu@warn@cellspace\fi
+ \csname\ifcsname ifHy@hyperfootnotes\endcsname %
+ ifHy@hyperfootnotes\else iffalse\fi\endcsname
+ \let\tabu@footnotetext \tabu@Hy@ftntext
+ \let\tabu@xfootnote \tabu@Hy@xfootnote \fi
+ \ifdefined\FV@DefineCheckEnd%
+ \tabu@fancyvrb \fi
+ \ifdefined\color %
+ \let\tabu@color \color
+ \def\tabu@leavevmodecolor ##1{%
+ \def\tabu@leavevmodecolor {\leavevmode ##1}%
+ }\expandafter\tabu@leavevmodecolor\expandafter{\color}%
+ \else
+ \let\tabu@color \tabu@nocolor
+ \let\tabu@leavevmodecolor \@firstofone \fi
+ \tabu@latextwoe
+ \ifdefined\@raggedtwoe@everyselectfont %
+ \tabu@raggedtwoe
+ \else
+ \let\tabu@cell@L \tabu@cell@l
+ \let\tabu@cell@R \tabu@cell@r
+ \let\tabu@cell@C \tabu@cell@c
+ \let\tabu@cell@J \tabu@cell@j \fi
+ \expandafter\in@ \expandafter\@arrayright \expandafter{\endarray}%
+ \ifin@ \let\tabu@endarray \endarray
+ \else \tabu@fix@arrayright \fi%
+ \everyrow{}%
+}% \tabu@AtBeginDocument
+\def\tabu@warn@cellspace{%
+ \PackageWarning{tabu}{%
+ Package cellspace has some limitations
+ \MessageBreak And redefines some macros of array.sty.
+ \MessageBreak Please use \string\tabulinesep\space to control
+ \MessageBreak vertical spacing of lines inside tabu environment}%
+}% \tabu@warn@cellspace
+%% tabu Package initialisation
+\tabuscantokensfalse
+\let\tabu@arc@G \relax
+\let\tabu@drsc@G \relax
+\let\tabu@evr@G \@empty
+\let\tabu@rc@G \@empty
+\def\tabu@ls@G {\tabu@linestyle@}%
+\let\tabu@@rowfontreset \@empty %
+\let\tabu@@celllalign \@empty
+\let\tabu@@cellralign \@empty
+\let\tabu@@cellleft \@empty
+\let\tabu@@cellright \@empty
+\def\tabu@naturalXmin {\z@}
+\def\tabu@naturalXmax {\z@}
+\let\tabu@rowfontreset \@empty
+\def\tabulineon {4pt}\let\tabulineoff \tabulineon
+\tabu@everyrowtrue
+\ifdefined\pdfelapsedtime %
+ \def\tabu@pdftimer {\xdef\tabu@starttime{\the\pdfelapsedtime}}%
+\else \let\tabu@pdftimer \relax \let\tabu@message@etime \relax
+\fi
+\tracingtabu=\z@
+\newtabulinestyle {=\maxdimen}% creates the 'factory' settings \tabu@linestyle@
+\tabulinestyle{}
+\taburowcolors{}
+\let\tabudefaulttarget \linewidth
+\ProcessOptions* % \ProcessOptions* is quicker !
+\endinput
+%%
+%% End of file `tabu.sty'.
diff --git a/doc/rtfm/man3/GL_AREA_SIZE.3 b/doc/rtfm/man3/GL_AREA_SIZE.3
new file mode 100644
index 0000000..16745d6
--- /dev/null
+++ b/doc/rtfm/man3/GL_AREA_SIZE.3
@@ -0,0 +1 @@
+.so man3/gl.c.3
diff --git a/doc/rtfm/man3/Stack.3 b/doc/rtfm/man3/Stack.3
new file mode 100644
index 0000000..9fb6095
--- /dev/null
+++ b/doc/rtfm/man3/Stack.3
@@ -0,0 +1,30 @@
+.TH "Stack" 3 "Version 0.1.0" "Gem-graph" \" -*- nroff -*-
+.ad l
+.nh
+.SH NAME
+Stack \- struct images_bff {GtkWidget *arr[MAX_SIZE]; int top;}; static struct images_bff *my_list = NULL;//, *babar = NULL; static struct images_bff *alloc_images_bff () { struct images_bff *p; p = malloc (sizeof (struct images_bff)); if (p == NULL) printf ('fatal: ran out of storage'); p->arr[MAX_SIZE] = NULL; p->top = 0; return p; } static void add_to_mylist (int my_int) { struct images_bff *p = alloc_images_bff (); p->arr[MAX_SIZE] = NULL; // TODO p->top = my_int; my_list = p; } static void free_intlist (struct images_bff *p) { TODO } TODO free_intlist (mylist); TODO mylist = NULL; TODO offsetof (type, field)
+
+.SH SYNOPSIS
+.br
+.PP
+.SS "Public Attributes"
+
+.in +1c
+.ti -1c
+.RI "GtkWidget * \fBarr\fP [MAX_SIZE]"
+.br
+.RI "*arr[MAX_SIZE] phantom documentation "
+.ti -1c
+.RI "int \fBtop\fP"
+.br
+.RI "top phantom documentation "
+.in -1c
+.SH "Detailed Description"
+.PP
+struct images_bff {GtkWidget *arr[MAX_SIZE]; int top;}; static struct images_bff *my_list = NULL;//, *babar = NULL; static struct images_bff *alloc_images_bff () { struct images_bff *p; p = malloc (sizeof (struct images_bff)); if (p == NULL) printf ('fatal: ran out of storage'); p->arr[MAX_SIZE] = NULL; p->top = 0; return p; } static void add_to_mylist (int my_int) { struct images_bff *p = alloc_images_bff (); p->arr[MAX_SIZE] = NULL; // TODO p->top = my_int; my_list = p; } static void free_intlist (struct images_bff *p) { TODO } TODO free_intlist (mylist); TODO mylist = NULL; TODO offsetof (type, field)
+
+phantom documentation used to test the functioning of doxygen
+
+.SH "Author"
+.PP
+Generated automatically by Doxygen for Gem-graph from the source code\&.
diff --git a/doc/rtfm/man3/TreeNode_t.3 b/doc/rtfm/man3/TreeNode_t.3
new file mode 100644
index 0000000..7de6c62
--- /dev/null
+++ b/doc/rtfm/man3/TreeNode_t.3
@@ -0,0 +1,34 @@
+.TH "TreeNode_t" 3 "Version 0.1.0" "Gem-graph" \" -*- nroff -*-
+.ad l
+.nh
+.SH NAME
+TreeNode_t \- phantom documentation used to test the functioning of doxygen
+
+.SH SYNOPSIS
+.br
+.PP
+.PP
+\fC#include \fP
+.SS "Public Attributes"
+
+.in +1c
+.ti -1c
+.RI "gchar * \fBtext\fP"
+.br
+.RI "*text phantom documentation "
+.ti -1c
+.RI "struct \fBTreeNode_t\fP * \fBchild\fP"
+.br
+.RI "*child phantom documentation "
+.ti -1c
+.RI "struct \fBTreeNode_t\fP * \fBnext\fP"
+.br
+.RI "*next phantom documentation "
+.in -1c
+.SH "Detailed Description"
+.PP
+phantom documentation used to test the functioning of doxygen
+
+.SH "Author"
+.PP
+Generated automatically by Doxygen for Gem-graph from the source code\&.
diff --git a/doc/rtfm/man3/arr.3 b/doc/rtfm/man3/arr.3
new file mode 100644
index 0000000..25d78db
--- /dev/null
+++ b/doc/rtfm/man3/arr.3
@@ -0,0 +1 @@
+.so man3/Stack.3
diff --git a/doc/rtfm/man3/arrow_t.3 b/doc/rtfm/man3/arrow_t.3
new file mode 100644
index 0000000..71d27ef
--- /dev/null
+++ b/doc/rtfm/man3/arrow_t.3
@@ -0,0 +1,42 @@
+.TH "arrow_t" 3 "Version 0.1.0" "Gem-graph" \" -*- nroff -*-
+.ad l
+.nh
+.SH NAME
+arrow_t \- phantom documentation used to test the functioning of doxygen
+
+.SH SYNOPSIS
+.br
+.PP
+.PP
+\fC#include \fP
+.SS "Public Attributes"
+
+.in +1c
+.ti -1c
+.RI "uint \fBload\fP"
+.br
+.RI "load phantom documentation "
+.ti -1c
+.RI "uint \fBsite\fP"
+.br
+.RI "site phantom documentation "
+.ti -1c
+.RI "uint \fBx\fP"
+.br
+.RI "x phantom documentation "
+.ti -1c
+.RI "uint \fBy\fP"
+.br
+.RI "y phantom documentation "
+.ti -1c
+.RI "uint \fBz\fP"
+.br
+.RI "z phantom documentation "
+.in -1c
+.SH "Detailed Description"
+.PP
+phantom documentation used to test the functioning of doxygen
+
+.SH "Author"
+.PP
+Generated automatically by Doxygen for Gem-graph from the source code\&.
diff --git a/doc/rtfm/man3/arrows_nb.3 b/doc/rtfm/man3/arrows_nb.3
new file mode 100644
index 0000000..2ecd9c0
--- /dev/null
+++ b/doc/rtfm/man3/arrows_nb.3
@@ -0,0 +1 @@
+.so man3/graphics_stack_t.3
diff --git a/doc/rtfm/man3/arrows_ptr.3 b/doc/rtfm/man3/arrows_ptr.3
new file mode 100644
index 0000000..2ecd9c0
--- /dev/null
+++ b/doc/rtfm/man3/arrows_ptr.3
@@ -0,0 +1 @@
+.so man3/graphics_stack_t.3
diff --git a/doc/rtfm/man3/buffer_colors_0_arrow.3 b/doc/rtfm/man3/buffer_colors_0_arrow.3
new file mode 100644
index 0000000..2ecd9c0
--- /dev/null
+++ b/doc/rtfm/man3/buffer_colors_0_arrow.3
@@ -0,0 +1 @@
+.so man3/graphics_stack_t.3
diff --git a/doc/rtfm/man3/buffer_colors_origin.3 b/doc/rtfm/man3/buffer_colors_origin.3
new file mode 100644
index 0000000..2ecd9c0
--- /dev/null
+++ b/doc/rtfm/man3/buffer_colors_origin.3
@@ -0,0 +1 @@
+.so man3/graphics_stack_t.3
diff --git a/doc/rtfm/man3/buffer_colors_size.3 b/doc/rtfm/man3/buffer_colors_size.3
new file mode 100644
index 0000000..2ecd9c0
--- /dev/null
+++ b/doc/rtfm/man3/buffer_colors_size.3
@@ -0,0 +1 @@
+.so man3/graphics_stack_t.3
diff --git a/doc/rtfm/man3/buffer_lines_0_arrow.3 b/doc/rtfm/man3/buffer_lines_0_arrow.3
new file mode 100644
index 0000000..2ecd9c0
--- /dev/null
+++ b/doc/rtfm/man3/buffer_lines_0_arrow.3
@@ -0,0 +1 @@
+.so man3/graphics_stack_t.3
diff --git a/doc/rtfm/man3/buffer_lines_origin.3 b/doc/rtfm/man3/buffer_lines_origin.3
new file mode 100644
index 0000000..2ecd9c0
--- /dev/null
+++ b/doc/rtfm/man3/buffer_lines_origin.3
@@ -0,0 +1 @@
+.so man3/graphics_stack_t.3
diff --git a/doc/rtfm/man3/buffer_lines_size.3 b/doc/rtfm/man3/buffer_lines_size.3
new file mode 100644
index 0000000..2ecd9c0
--- /dev/null
+++ b/doc/rtfm/man3/buffer_lines_size.3
@@ -0,0 +1 @@
+.so man3/graphics_stack_t.3
diff --git a/doc/rtfm/man3/buffer_plans_0_arrow.3 b/doc/rtfm/man3/buffer_plans_0_arrow.3
new file mode 100644
index 0000000..2ecd9c0
--- /dev/null
+++ b/doc/rtfm/man3/buffer_plans_0_arrow.3
@@ -0,0 +1 @@
+.so man3/graphics_stack_t.3
diff --git a/doc/rtfm/man3/buffer_plans_origin.3 b/doc/rtfm/man3/buffer_plans_origin.3
new file mode 100644
index 0000000..2ecd9c0
--- /dev/null
+++ b/doc/rtfm/man3/buffer_plans_origin.3
@@ -0,0 +1 @@
+.so man3/graphics_stack_t.3
diff --git a/doc/rtfm/man3/buffer_plans_size.3 b/doc/rtfm/man3/buffer_plans_size.3
new file mode 100644
index 0000000..2ecd9c0
--- /dev/null
+++ b/doc/rtfm/man3/buffer_plans_size.3
@@ -0,0 +1 @@
+.so man3/graphics_stack_t.3
diff --git a/doc/rtfm/man3/buffer_vertex_0_arrow.3 b/doc/rtfm/man3/buffer_vertex_0_arrow.3
new file mode 100644
index 0000000..2ecd9c0
--- /dev/null
+++ b/doc/rtfm/man3/buffer_vertex_0_arrow.3
@@ -0,0 +1 @@
+.so man3/graphics_stack_t.3
diff --git a/doc/rtfm/man3/buffer_vertex_origin.3 b/doc/rtfm/man3/buffer_vertex_origin.3
new file mode 100644
index 0000000..2ecd9c0
--- /dev/null
+++ b/doc/rtfm/man3/buffer_vertex_origin.3
@@ -0,0 +1 @@
+.so man3/graphics_stack_t.3
diff --git a/doc/rtfm/man3/buffer_vertex_size.3 b/doc/rtfm/man3/buffer_vertex_size.3
new file mode 100644
index 0000000..2ecd9c0
--- /dev/null
+++ b/doc/rtfm/man3/buffer_vertex_size.3
@@ -0,0 +1 @@
+.so man3/graphics_stack_t.3
diff --git a/doc/rtfm/man3/child.3 b/doc/rtfm/man3/child.3
new file mode 100644
index 0000000..b0592f6
--- /dev/null
+++ b/doc/rtfm/man3/child.3
@@ -0,0 +1 @@
+.so man3/TreeNode_t.3
diff --git a/doc/rtfm/man3/color_buffer.3 b/doc/rtfm/man3/color_buffer.3
new file mode 100644
index 0000000..2ecd9c0
--- /dev/null
+++ b/doc/rtfm/man3/color_buffer.3
@@ -0,0 +1 @@
+.so man3/graphics_stack_t.3
diff --git a/doc/rtfm/man3/container_widget.3 b/doc/rtfm/man3/container_widget.3
new file mode 100644
index 0000000..4a92a9f
--- /dev/null
+++ b/doc/rtfm/man3/container_widget.3
@@ -0,0 +1 @@
+.so man3/stack_index_t.3
diff --git a/doc/rtfm/man3/create_axis_slider.3 b/doc/rtfm/man3/create_axis_slider.3
new file mode 100644
index 0000000..16745d6
--- /dev/null
+++ b/doc/rtfm/man3/create_axis_slider.3
@@ -0,0 +1 @@
+.so man3/gl.c.3
diff --git a/doc/rtfm/man3/dblist.3 b/doc/rtfm/man3/dblist.3
new file mode 100644
index 0000000..22387f2
--- /dev/null
+++ b/doc/rtfm/man3/dblist.3
@@ -0,0 +1,30 @@
+.TH "dblist" 3 "Version 0.1.0" "Gem-graph" \" -*- nroff -*-
+.ad l
+.nh
+.SH NAME
+dblist \- phantom documentation used to test the functioning of doxygen
+
+.SH SYNOPSIS
+.br
+.PP
+.PP
+\fC#include \fP
+.SS "Public Attributes"
+
+.in +1c
+.ti -1c
+.RI "\fBelem\fP * \fBfirst\fP"
+.br
+.RI "*first phantom documentation "
+.ti -1c
+.RI "\fBelem\fP * \fBlast\fP"
+.br
+.RI "*last phantom documentation "
+.in -1c
+.SH "Detailed Description"
+.PP
+phantom documentation used to test the functioning of doxygen
+
+.SH "Author"
+.PP
+Generated automatically by Doxygen for Gem-graph from the source code\&.
diff --git a/doc/rtfm/man3/dispatch.c.3 b/doc/rtfm/man3/dispatch.c.3
new file mode 100644
index 0000000..4b0ebb0
--- /dev/null
+++ b/doc/rtfm/man3/dispatch.c.3
@@ -0,0 +1,459 @@
+.TH "src/fsm/dispatch.c" 3 "Version 0.1.0" "Gem-graph" \" -*- nroff -*-
+.ad l
+.nh
+.SH NAME
+src/fsm/dispatch.c \-
+.IP "\(bu" 2
+OOOOOOOOOOO OOOOO OOO OOO * OO OO OO OOOO OOOO * OO OO OO OO OO OO * OOOOOO OO OO OO OO OO * OO OO OO OOO OO * OO OO OO OO * OO OO OOO OO OO * OO OOOOOO OO OO *
+.IP " \(bu" 4
+
+.PP
+
+.PP
+
+
+.SH SYNOPSIS
+.br
+.PP
+\fC#include \fP
+.br
+\fC#include '\&.\&./\&.\&./include/fsm\&.h'\fP
+.br
+\fC#include '\&.\&./\&.\&./include/util\&.h'\fP
+.br
+\fC#include '\&.\&./\&.\&./include/widget\&.h'\fP
+.br
+
+.SS "Functions"
+
+.in +1c
+.ti -1c
+.RI "void \fBfsm_journal_publication_request\fP ()"
+.br
+.RI "The \fBfsm_journal_publication_request()\fP is called only once, by \fBmain()\fP, just after closing the app and before ending the program\&. "
+.ti -1c
+.RI "void \fBfsm_journal_event\fP (int severity, int source, const char *file_source, const char *function_source, const char *string_value)"
+.br
+.RI "It is mandatory for any event to call this function to be published in the journal\&. "
+.ti -1c
+.RI "void \fBfsm_init\fP (char *initial_message_from_main)"
+.br
+.RI "F S M I N I T *\&. "
+.ti -1c
+.RI "void \fBfsm_set_preferences_modified\fP (bool value)"
+.br
+.RI "setter for the static boolean: 'preferences_have_been_modified' "
+.ti -1c
+.RI "bool \fBfsm_get_preferences_state\fP ()"
+.br
+.RI "getter for the static boolean: 'preferences_have_been_modified' "
+.ti -1c
+.RI "int \fBfsm_get_exec_edit\fP ()"
+.br
+.RI "Any function that modifies the client window must obtain this boolean\&. "
+.ti -1c
+.RI "int \fBfsm_get_state_rules_data\fP ()"
+.br
+.RI "Any function that modifies the client window must obtain this value\&. "
+.ti -1c
+.RI "void \fBfsm_set_exec_edit\fP (int choice)"
+.br
+.RI "setter for the static value: 'choice_STATE_RULES_DATA' (in this file) "
+.ti -1c
+.RI "void \fBfsm_set_state_rules_data\fP (int choice)"
+.br
+.RI "setter for the static value: 'choice_STATE_RULES_DATA' (in this file) "
+.in -1c
+.SH "Detailed Description"
+.PP
+
+.IP "\(bu" 2
+OOOOOOOOOOO OOOOO OOO OOO * OO OO OO OOOO OOOO * OO OO OO OO OO OO * OOOOOO OO OO OO OO OO * OO OO OO OOO OO * OO OO OO OO * OO OO OOO OO OO * OO OOOOOO OO OO *
+.IP " \(bu" 4
+
+.PP
+
+.PP
+
+
+This Finite State Machine (fsm) describes all the possible states of the Gem-graph client and all the transitions between these states\&.
+.PP
+gem-graph-client fsm (Finite State Machine) manages four topics:
+.IP "\(bu" 2
+engine (window appearance)
+.IP "\(bu" 2
+measures (current measurements)
+.IP "\(bu" 2
+results (current data acquisition and displays)
+.IP "\(bu" 2
+preferences (current user preferences)
+.PP
+.PP
+Each state of the finite state machine (fsm) is a combination of their states\&.
+.PP
+It must be
+.IP "\(bu" 2
+saved at the end of a work session and
+.IP "\(bu" 2
+reread (available) at the start of a new session\&.
+.PP
+.PP
+No state of the fsm should be defined in another module\&. No fsm transition needs to be executed in another module\&.
+.PP
+The journal is created, edited and published from here\&.
+.SH "Function Documentation"
+.PP
+.SS "int fsm_get_exec_edit ()"
+
+.PP
+Any function that modifies the client window must obtain this boolean\&. The 'state' and 'rules' pages appearance depends heavily on this\&.
+.PP
+see include/fsm enum fsm_enum_exec_edit { EXEC, EDIT } The current int may be replaced by a boolean before publication\&. TODO
+.PP
+\fBDate\fP
+.RS 4
+2024-08
+.RE
+.PP
+\fBAuthor\fP
+.RS 4
+Jean
+.RE
+.PP
+\fBSee also\fP
+.RS 4
+src/widget/one_rule/dispatch
+.PP
+src/widget/state/dispatch * 2
+.PP
+src/signal
+.PP
+include/fsm enum fsm_enum_exec_edit { EXEC, EDIT } << TODO check this
+.RE
+.PP
+\fBReturns\fP
+.RS 4
+choice_EXEC_EDIT
+.RE
+.PP
+
+.SS "bool fsm_get_preferences_state ()"
+
+.PP
+getter for the static boolean: 'preferences_have_been_modified'
+.PP
+\fBDate\fP
+.RS 4
+2024-08
+.RE
+.PP
+\fBAuthor\fP
+.RS 4
+Jean
+.RE
+.PP
+\fBSee also\fP
+.RS 4
+TODO A function must obtain this boolean when it stores the current state of the fsm (including \fBpreferences\fP) before closing the current session\&.
+.PP
+(none)
+.RE
+.PP
+\fBReturns\fP
+.RS 4
+preferences_have_been_modified
+.RE
+.PP
+
+.SS "int fsm_get_state_rules_data ()"
+
+.PP
+Any function that modifies the client window must obtain this value\&. The pages selection and the window appearance depends heavily on this\&.
+.PP
+see include/fsm enum fsm_enum_state_rules_data { SYNTH, STATE, RULES, DATA }
+.PP
+\fBDate\fP
+.RS 4
+2024-08
+.RE
+.PP
+\fBAuthor\fP
+.RS 4
+Jean
+.RE
+.PP
+\fBSee also\fP
+.RS 4
+src/widget/topbar/left
+.PP
+src/signal
+.PP
+(none)
+.RE
+.PP
+\fBReturns\fP
+.RS 4
+choice_STATE_RULES_DATA
+.RE
+.PP
+
+.SS "void fsm_init (char * initial_message_from_main)"
+
+.PP
+F S M I N I T *\&. This is the first function called by '\fBmain\&.c\fP' It initiates the journal and four lists which are: 'measures', 'results', 'displayables results' and 'preferences'\&. These lists will be used to define the current state of the fsm\&.
+.PP
+\fBDate\fP
+.RS 4
+2024-08
+.RE
+.PP
+\fBAuthor\fP
+.RS 4
+Jean
+.RE
+.PP
+\fBSee also\fP
+.RS 4
+src/main/main()
+.PP
+src/journal/fsm_journal_init()
+.PP
+src/fsm/dispatch/fsm_journal_event()
+.PP
+src/fsm/measures/manager/fsm_list_init_measures()
+.PP
+src/fsm/results/manager/fsm_list_init_results()
+.PP
+src/fsm/preferences/manager/fsm_list_init_displayables()
+.PP
+src/fsm/preferences/manager/fsm_list_init_preferences()
+.RE
+.PP
+\fBParameters\fP
+.RS 4
+\fI*initial_message_from_main\fP
+.RE
+.PP
+
+.SS "void fsm_journal_event (int severity, int source, const char * file_source, const char * function_source, const char * string_value)"
+
+.PP
+It is mandatory for any event to call this function to be published in the journal\&. Before publication, a filter can be applied here (and only here) to select only some events of interest (during debugging, for example)\&.
+.PP
+If there are too many events, a filter can be applied here to select a few interesting events for publication in the log\&.
+.PP
+This filter can operate on any the following five parameters: severity, source, *file_source, *function_source, *string_value\&.
+.PP
+\fBSee also\fP
+.RS 4
+below (params)
+.RE
+.PP
+Simple filters (on a single parameter) can be combined using the logical operators 'and' and 'or' and parentheses\&.
+.PP
+Use: $ grep -r 'fsm_journal_event' to confirm the callergraph calls\&.
+.PP
+\fBDate\fP
+.RS 4
+2024-08
+.RE
+.PP
+\fBAuthor\fP
+.RS 4
+Jean
+.RE
+.PP
+\fBSee also\fP
+.RS 4
+src/journal\&.c/fsm_journal_push_front()
+.PP
+src/main/main()
+.PP
+src/widget/topbar/modal\&.c
+.PP
+src/widget/topbar/right\&.c
+.PP
+src/widget/topbar/dialog\&.c
+.PP
+src/widget/topbar/left\&.c
+.PP
+src/widget/topbar/dispatch\&.c * 3
+.PP
+src/widget/one_rule/dispatch\&.c
+.PP
+src/widget/one_rule/algebra/conditions\&.c * 2
+.PP
+src/widget/measure/dispatch\&.c
+.PP
+src/widget/dispatch\&.c * 3
+.PP
+src/widget/all_rules/dispatch\&.c
+.PP
+\fBsrc/fsm/preferences/manager\&.c\fP * 8
+.PP
+src/fsm/measures/manager\&.c * 2
+.PP
+src/fsm/measures/tools_list\&.c * 4
+.PP
+\fBsrc/fsm/dispatch\&.c\fP * 10
+.PP
+src/fsm/results/manager\&.c
+.PP
+src/util/tree\&.c
+.PP
+src/signal\&.c * 38
+.RE
+.PP
+\fBParameters\fP
+.RS 4
+\fIseverity\fP <>
+.RE
+.PP
+\fBSee also\fP
+.RS 4
+enum fsm_enum_journal_severity in include/fsm\&.h 'severity' is a pre-defined value that must be associated to each event\&. It ranges from zero to six : CRITICAL ERROR WARNING INFO MESSAGE DEBUG SPEW 0 1 2 3 4 5 6
+.RE
+.PP
+\fBParameters\fP
+.RS 4
+\fIsource\fP <>
+.RE
+.PP
+\fBSee also\fP
+.RS 4
+enum fsm_enum_journal_source in include/fsm\&.h 'source' is a pre-defined value that can be associated to each event\&. It is not mandatory\&. It can be set to 'NULL'\&.
+.RE
+.PP
+\fBParameters\fP
+.RS 4
+\fI*file_source\fP <> the name of the file that emits the event\&.
+.br
+\fI*function_source\fP <> the function that emits the event\&.
+.br
+\fI*string_value\fP <> any value that can qualify the event and provides useful information when reading the log\&.
+.RE
+.PP
+
+.SS "void fsm_journal_publication_request ()"
+
+.PP
+The \fBfsm_journal_publication_request()\fP is called only once, by \fBmain()\fP, just after closing the app and before ending the program\&. This is to guarantee the chronological order of the events in the journal\&.
+.PP
+The log is modified for each event but events can be send asynchronously\&. This is why the journal is only published once, before the end of 'main()', Its chronological order is therefore guaranteed\&.
+.PP
+src/journal\&.c/fsm_journal_publish() (called here) is the last function of the program to be executed\&.
+.PP
+The \fBfsm_struct_journal\fP (gg_logs) is a static instance in this file\&. Therefore, all the functions that read or write it are in this file\&. This is to avoid uncontrolled operations on it\&.
+.PP
+\fBDate\fP
+.RS 4
+2024-08
+.RE
+.PP
+\fBAuthor\fP
+.RS 4
+Jean
+.RE
+.PP
+\fBSee also\fP
+.RS 4
+src/main/main()
+.PP
+src/journal/fsm_journal_publish()
+.RE
+.PP
+
+.SS "void fsm_set_exec_edit (int choice)"
+
+.PP
+setter for the static value: 'choice_STATE_RULES_DATA' (in this file) see include/fsm enum fsm_enum_exec_edit { EXEC, EDIT }
+.PP
+\fBDate\fP
+.RS 4
+2024-08
+.RE
+.PP
+\fBAuthor\fP
+.RS 4
+Jean
+.RE
+.PP
+\fBSee also\fP
+.RS 4
+(none)
+.PP
+src/signal * 2
+.RE
+.PP
+\fBParameters\fP
+.RS 4
+\fIchoice\fP < a boolean value which can be 'EXEC' or 'EDIT'
+.RE
+.PP
+
+.SS "void fsm_set_preferences_modified (bool value)"
+
+.PP
+setter for the static boolean: 'preferences_have_been_modified'
+.PP
+\fBDate\fP
+.RS 4
+2024-08
+.RE
+.PP
+\fBAuthor\fP
+.RS 4
+Jean
+.RE
+.PP
+\fBSee also\fP
+.RS 4
+TODO To be used by any function that modifies the current user \fBpreferences\fP
+.PP
+\fBfsm_journal_event()\fP
+.RE
+.PP
+\fBParameters\fP
+.RS 4
+\fIvalue\fP = TRUE if preferences_have_been_modified\&.
+.RE
+.PP
+
+.SS "void fsm_set_state_rules_data (int choice)"
+
+.PP
+setter for the static value: 'choice_STATE_RULES_DATA' (in this file) see include/fsm enum fsm_enum_state_rules_data { SYNTH, STATE, RULES, DATA } Today (2024-10) the initial page is set to 'SYNTH'\&.
+.PP
+\fBSee also\fP
+.RS 4
+line 292 choice_STATE_RULES_DATA = SYNTH; NB This choice can be temporarily modified for debugging purpose:
+.PP
+end of the function: \fBfsm/dispatch\&.c\fP window_design_topbar_left()
+.RE
+.PP
+\fBDate\fP
+.RS 4
+2024-08
+.RE
+.PP
+\fBAuthor\fP
+.RS 4
+Jean
+.RE
+.PP
+\fBSee also\fP
+.RS 4
+src/signal * 4
+.PP
+(none)
+.RE
+.PP
+\fBParameters\fP
+.RS 4
+\fIchoice\fP
+.RE
+.PP
+
+.SH "Author"
+.PP
+Generated automatically by Doxygen for Gem-graph from the source code\&.
diff --git a/doc/rtfm/man3/elem.3 b/doc/rtfm/man3/elem.3
new file mode 100644
index 0000000..7470024
--- /dev/null
+++ b/doc/rtfm/man3/elem.3
@@ -0,0 +1,34 @@
+.TH "elem" 3 "Version 0.1.0" "Gem-graph" \" -*- nroff -*-
+.ad l
+.nh
+.SH NAME
+elem \- phantom documentation used to test the functioning of doxygen
+
+.SH SYNOPSIS
+.br
+.PP
+.PP
+\fC#include \fP
+.SS "Public Attributes"
+
+.in +1c
+.ti -1c
+.RI "int \fBvalue\fP"
+.br
+.RI "*value phantom documentation "
+.ti -1c
+.RI "struct \fBelem\fP * \fBprev\fP"
+.br
+.RI "*prev phantom documentation "
+.ti -1c
+.RI "struct \fBelem\fP * \fBnext\fP"
+.br
+.RI "*next phantom documentation "
+.in -1c
+.SH "Detailed Description"
+.PP
+phantom documentation used to test the functioning of doxygen
+
+.SH "Author"
+.PP
+Generated automatically by Doxygen for Gem-graph from the source code\&.
diff --git a/doc/rtfm/man3/file_source.3 b/doc/rtfm/man3/file_source.3
new file mode 100644
index 0000000..a89bde9
--- /dev/null
+++ b/doc/rtfm/man3/file_source.3
@@ -0,0 +1 @@
+.so man3/fsm_struct_journal_unit.3
diff --git a/doc/rtfm/man3/first.3 b/doc/rtfm/man3/first.3
new file mode 100644
index 0000000..92b313e
--- /dev/null
+++ b/doc/rtfm/man3/first.3
@@ -0,0 +1 @@
+.so man3/dblist.3
diff --git a/doc/rtfm/man3/fsm_add_displayable.3 b/doc/rtfm/man3/fsm_add_displayable.3
new file mode 100644
index 0000000..5760f47
--- /dev/null
+++ b/doc/rtfm/man3/fsm_add_displayable.3
@@ -0,0 +1 @@
+.so man3/manager.c.3
diff --git a/doc/rtfm/man3/fsm_get_exec_edit.3 b/doc/rtfm/man3/fsm_get_exec_edit.3
new file mode 100644
index 0000000..c6006cc
--- /dev/null
+++ b/doc/rtfm/man3/fsm_get_exec_edit.3
@@ -0,0 +1 @@
+.so man3/dispatch.c.3
diff --git a/doc/rtfm/man3/fsm_get_preferences_state.3 b/doc/rtfm/man3/fsm_get_preferences_state.3
new file mode 100644
index 0000000..c6006cc
--- /dev/null
+++ b/doc/rtfm/man3/fsm_get_preferences_state.3
@@ -0,0 +1 @@
+.so man3/dispatch.c.3
diff --git a/doc/rtfm/man3/fsm_get_state_rules_data.3 b/doc/rtfm/man3/fsm_get_state_rules_data.3
new file mode 100644
index 0000000..c6006cc
--- /dev/null
+++ b/doc/rtfm/man3/fsm_get_state_rules_data.3
@@ -0,0 +1 @@
+.so man3/dispatch.c.3
diff --git a/doc/rtfm/man3/fsm_init.3 b/doc/rtfm/man3/fsm_init.3
new file mode 100644
index 0000000..c6006cc
--- /dev/null
+++ b/doc/rtfm/man3/fsm_init.3
@@ -0,0 +1 @@
+.so man3/dispatch.c.3
diff --git a/doc/rtfm/man3/fsm_journal_event.3 b/doc/rtfm/man3/fsm_journal_event.3
new file mode 100644
index 0000000..c6006cc
--- /dev/null
+++ b/doc/rtfm/man3/fsm_journal_event.3
@@ -0,0 +1 @@
+.so man3/dispatch.c.3
diff --git a/doc/rtfm/man3/fsm_journal_publication_request.3 b/doc/rtfm/man3/fsm_journal_publication_request.3
new file mode 100644
index 0000000..c6006cc
--- /dev/null
+++ b/doc/rtfm/man3/fsm_journal_publication_request.3
@@ -0,0 +1 @@
+.so man3/dispatch.c.3
diff --git a/doc/rtfm/man3/fsm_list_init_displayables.3 b/doc/rtfm/man3/fsm_list_init_displayables.3
new file mode 100644
index 0000000..5760f47
--- /dev/null
+++ b/doc/rtfm/man3/fsm_list_init_displayables.3
@@ -0,0 +1 @@
+.so man3/manager.c.3
diff --git a/doc/rtfm/man3/fsm_list_init_preferences.3 b/doc/rtfm/man3/fsm_list_init_preferences.3
new file mode 100644
index 0000000..5760f47
--- /dev/null
+++ b/doc/rtfm/man3/fsm_list_init_preferences.3
@@ -0,0 +1 @@
+.so man3/manager.c.3
diff --git a/doc/rtfm/man3/fsm_reset_all_situations_values.3 b/doc/rtfm/man3/fsm_reset_all_situations_values.3
new file mode 100644
index 0000000..5760f47
--- /dev/null
+++ b/doc/rtfm/man3/fsm_reset_all_situations_values.3
@@ -0,0 +1 @@
+.so man3/manager.c.3
diff --git a/doc/rtfm/man3/fsm_set_exec_edit.3 b/doc/rtfm/man3/fsm_set_exec_edit.3
new file mode 100644
index 0000000..c6006cc
--- /dev/null
+++ b/doc/rtfm/man3/fsm_set_exec_edit.3
@@ -0,0 +1 @@
+.so man3/dispatch.c.3
diff --git a/doc/rtfm/man3/fsm_set_preferences_modified.3 b/doc/rtfm/man3/fsm_set_preferences_modified.3
new file mode 100644
index 0000000..c6006cc
--- /dev/null
+++ b/doc/rtfm/man3/fsm_set_preferences_modified.3
@@ -0,0 +1 @@
+.so man3/dispatch.c.3
diff --git a/doc/rtfm/man3/fsm_set_state_rules_data.3 b/doc/rtfm/man3/fsm_set_state_rules_data.3
new file mode 100644
index 0000000..c6006cc
--- /dev/null
+++ b/doc/rtfm/man3/fsm_set_state_rules_data.3
@@ -0,0 +1 @@
+.so man3/dispatch.c.3
diff --git a/doc/rtfm/man3/fsm_set_store_restore_reset.3 b/doc/rtfm/man3/fsm_set_store_restore_reset.3
new file mode 100644
index 0000000..5760f47
--- /dev/null
+++ b/doc/rtfm/man3/fsm_set_store_restore_reset.3
@@ -0,0 +1 @@
+.so man3/manager.c.3
diff --git a/doc/rtfm/man3/fsm_struct_journal.3 b/doc/rtfm/man3/fsm_struct_journal.3
new file mode 100644
index 0000000..3fff903
--- /dev/null
+++ b/doc/rtfm/man3/fsm_struct_journal.3
@@ -0,0 +1,42 @@
+.TH "fsm_struct_journal" 3 "Version 0.1.0" "Gem-graph" \" -*- nroff -*-
+.ad l
+.nh
+.SH NAME
+fsm_struct_journal \- phantom documentation used to test the functioning of doxygen
+
+.SH SYNOPSIS
+.br
+.PP
+.PP
+\fC#include \fP
+.SS "Public Attributes"
+
+.in +1c
+.ti -1c
+.RI "\fBfsm_struct_journal_unit\fP * \fBfirst\fP"
+.br
+.ti -1c
+.RI "\fBfsm_struct_journal_unit\fP * \fBlast\fP"
+.br
+.in -1c
+.SH "Detailed Description"
+.PP
+phantom documentation used to test the functioning of doxygen
+.SH "Member Data Documentation"
+.PP
+.SS "\fBfsm_struct_journal_unit\fP* fsm_struct_journal::first"
+
+.IP "\(bu" 2
+phantom documentation
+.PP
+
+.SS "\fBfsm_struct_journal_unit\fP* fsm_struct_journal::last"
+
+.IP "\(bu" 2
+phantom documentation
+.PP
+
+
+.SH "Author"
+.PP
+Generated automatically by Doxygen for Gem-graph from the source code\&.
diff --git a/doc/rtfm/man3/fsm_struct_journal_unit.3 b/doc/rtfm/man3/fsm_struct_journal_unit.3
new file mode 100644
index 0000000..b43a086
--- /dev/null
+++ b/doc/rtfm/man3/fsm_struct_journal_unit.3
@@ -0,0 +1,87 @@
+.TH "fsm_struct_journal_unit" 3 "Version 0.1.0" "Gem-graph" \" -*- nroff -*-
+.ad l
+.nh
+.SH NAME
+fsm_struct_journal_unit \- phantom documentation used to test the functioning of doxygen
+
+.SH SYNOPSIS
+.br
+.PP
+.PP
+\fC#include \fP
+.SS "Public Attributes"
+
+.in +1c
+.ti -1c
+.RI "long \fByy_dd_mm\fP"
+.br
+.ti -1c
+.RI "long \fBusec\fP"
+.br
+.ti -1c
+.RI "const char * \fBfile_source\fP"
+.br
+.ti -1c
+.RI "const char * \fBfunction_source\fP"
+.br
+.ti -1c
+.RI "const char * \fBstring_value\fP"
+.br
+.ti -1c
+.RI "struct \fBfsm_struct_journal_unit\fP * \fBprev\fP"
+.br
+.ti -1c
+.RI "struct \fBfsm_struct_journal_unit\fP * \fBnext\fP"
+.br
+.in -1c
+.SH "Detailed Description"
+.PP
+phantom documentation used to test the functioning of doxygen
+.SH "Member Data Documentation"
+.PP
+.SS "const char* fsm_struct_journal_unit::file_source"
+
+.IP "\(bu" 2
+phantom documentation
+.PP
+
+.SS "const char* fsm_struct_journal_unit::function_source"
+
+.IP "\(bu" 2
+phantom documentation
+.PP
+
+.SS "struct \fBfsm_struct_journal_unit\fP* fsm_struct_journal_unit::next"
+
+.IP "\(bu" 2
+phantom documentation
+.PP
+
+.SS "struct \fBfsm_struct_journal_unit\fP* fsm_struct_journal_unit::prev"
+
+.IP "\(bu" 2
+phantom documentation
+.PP
+
+.SS "const char* fsm_struct_journal_unit::string_value"
+
+.IP "\(bu" 2
+phantom documentation
+.PP
+
+.SS "long fsm_struct_journal_unit::usec"
+
+.IP "\(bu" 2
+phantom documentation
+.PP
+
+.SS "long fsm_struct_journal_unit::yy_dd_mm"
+
+.IP "\(bu" 2
+phantom documentation
+.PP
+
+
+.SH "Author"
+.PP
+Generated automatically by Doxygen for Gem-graph from the source code\&.
diff --git a/doc/rtfm/man3/fsm_struct_list_data.3 b/doc/rtfm/man3/fsm_struct_list_data.3
new file mode 100644
index 0000000..7bfe870
--- /dev/null
+++ b/doc/rtfm/man3/fsm_struct_list_data.3
@@ -0,0 +1,30 @@
+.TH "fsm_struct_list_data" 3 "Version 0.1.0" "Gem-graph" \" -*- nroff -*-
+.ad l
+.nh
+.SH NAME
+fsm_struct_list_data \- phantom documentation used to test the functioning of doxygen
+
+.SH SYNOPSIS
+.br
+.PP
+.PP
+\fC#include \fP
+.SS "Public Attributes"
+
+.in +1c
+.ti -1c
+.RI "int \fBvalue\fP"
+.br
+.RI "*value phantom documentation "
+.ti -1c
+.RI "struct \fBfsm_struct_list_data\fP * \fBsuiv\fP"
+.br
+.RI "*suiv phantom documentation "
+.in -1c
+.SH "Detailed Description"
+.PP
+phantom documentation used to test the functioning of doxygen
+
+.SH "Author"
+.PP
+Generated automatically by Doxygen for Gem-graph from the source code\&.
diff --git a/doc/rtfm/man3/fsm_struct_list_disp.3 b/doc/rtfm/man3/fsm_struct_list_disp.3
new file mode 100644
index 0000000..f0643c2
--- /dev/null
+++ b/doc/rtfm/man3/fsm_struct_list_disp.3
@@ -0,0 +1,30 @@
+.TH "fsm_struct_list_disp" 3 "Version 0.1.0" "Gem-graph" \" -*- nroff -*-
+.ad l
+.nh
+.SH NAME
+fsm_struct_list_disp \- phantom documentation used to test the functioning of doxygen
+
+.SH SYNOPSIS
+.br
+.PP
+.PP
+\fC#include \fP
+.SS "Public Attributes"
+
+.in +1c
+.ti -1c
+.RI "int \fBvalue\fP"
+.br
+.RI "*value phantom documentation "
+.ti -1c
+.RI "struct \fBfsm_struct_list_disp\fP * \fBsuiv\fP"
+.br
+.RI "*suiv phantom documentation "
+.in -1c
+.SH "Detailed Description"
+.PP
+phantom documentation used to test the functioning of doxygen
+
+.SH "Author"
+.PP
+Generated automatically by Doxygen for Gem-graph from the source code\&.
diff --git a/doc/rtfm/man3/fsm_struct_list_tool.3 b/doc/rtfm/man3/fsm_struct_list_tool.3
new file mode 100644
index 0000000..5b5165c
--- /dev/null
+++ b/doc/rtfm/man3/fsm_struct_list_tool.3
@@ -0,0 +1,30 @@
+.TH "fsm_struct_list_tool" 3 "Version 0.1.0" "Gem-graph" \" -*- nroff -*-
+.ad l
+.nh
+.SH NAME
+fsm_struct_list_tool \- phantom documentation used to test the functioning of doxygen
+
+.SH SYNOPSIS
+.br
+.PP
+.PP
+\fC#include \fP
+.SS "Public Attributes"
+
+.in +1c
+.ti -1c
+.RI "int \fBvalue\fP"
+.br
+.RI "*value phantom documentation "
+.ti -1c
+.RI "struct \fBfsm_struct_list_tool\fP * \fBsuiv\fP"
+.br
+.RI "*suiv phantom documentation "
+.in -1c
+.SH "Detailed Description"
+.PP
+phantom documentation used to test the functioning of doxygen
+
+.SH "Author"
+.PP
+Generated automatically by Doxygen for Gem-graph from the source code\&.
diff --git a/doc/rtfm/man3/function_source.3 b/doc/rtfm/man3/function_source.3
new file mode 100644
index 0000000..a89bde9
--- /dev/null
+++ b/doc/rtfm/man3/function_source.3
@@ -0,0 +1 @@
+.so man3/fsm_struct_journal_unit.3
diff --git a/doc/rtfm/man3/gl.c.3 b/doc/rtfm/man3/gl.c.3
new file mode 100644
index 0000000..b49181d
--- /dev/null
+++ b/doc/rtfm/man3/gl.c.3
@@ -0,0 +1,214 @@
+.TH "src/util/draw/gl.c" 3 "Version 0.1.0" "Gem-graph" \" -*- nroff -*-
+.ad l
+.nh
+.SH NAME
+src/util/draw/gl.c
+.SH SYNOPSIS
+.br
+.PP
+\fC#include '\&.\&./\&.\&./\&.\&./include/graphics\&.h'\fP
+.br
+\fC#include '\&.\&./\&.\&./\&.\&./include/signal\&.h'\fP
+.br
+
+.SS "Classes"
+
+.in +1c
+.ti -1c
+.RI "struct \fBstack_index_t\fP"
+.br
+.RI "phantom documentation used to test the functioning of doxygen "
+.in -1c
+.SS "Macros"
+
+.in +1c
+.ti -1c
+.RI "#define \fBGL_AREA_SIZE\fP 400"
+.br
+.RI "phantom documentation used to test the functioning of doxygen "
+.in -1c
+.SS "Functions"
+
+.in +1c
+.ti -1c
+.RI "int \fButil_gl_set_arrow\fP (int stack_id, int arrows_nb, int space_X, int space_Y, int space_Z, int requested_weight, int site, int arrow_x, int arrow_y, int arrow_z)"
+.br
+.RI "phantom documentation used to test the functioning of doxygen "
+.ti -1c
+.RI "long \fButil_gl_get_stack\fP (void *container_widget)"
+.br
+.RI "Look for stack entry and returns stack_id\&. "
+.ti -1c
+.RI "long \fButil_gl_is_ready\fP (void *container_widget)"
+.br
+.RI "Look for stack entry and returns stack_id\&. "
+.ti -1c
+.RI "bool \fButil_gl_init_stack\fP (void *container_widget, GError *error_buffer)"
+.br
+.RI "Look for stack entry and initializes OpenGL for it\&. "
+.ti -1c
+.RI "bool \fButil_gl_shutdown_stack\fP (void *container_widget, GError *error_buffer)"
+.br
+.RI "Look for stack entry and shutdowns OpenGL for it\&. "
+.ti -1c
+.RI "void \fButil_gl_clean_stack_index\fP (void)"
+.br
+.RI "phantom documentation used to test the functioning of doxygen "
+.ti -1c
+.RI "bool \fButil_gl_render_stack\fP (GtkWidget *container_widget)"
+.br
+.RI "Look for stack entry and triggers OpenGL for drawing\&. "
+.ti -1c
+.RI "bool \fButil_gl_update_axis\fP (GtkWidget *container_widget, int axis, int value)"
+.br
+.RI "Look for stack entry and triggers OpenGL for drawing\&. "
+.ti -1c
+.RI "void \fButil_gl_shutdown_all_stacks\fP (void)"
+.br
+.RI "Look for every stack entry and shutdowns OpenGL for it\&. "
+.ti -1c
+.RI "GtkWidget * \fBcreate_axis_slider\fP (int axis)"
+.br
+.RI "Creates a slider widget\&. "
+.ti -1c
+.RI "bool \fButil_gl_setup_glarea\fP (int target_mode, GtkWidget *target_widget)"
+.br
+.RI "phantom documentation used to test the functioning of doxygen "
+.in -1c
+.SS "Variables"
+
+.in +1c
+.ti -1c
+.RI "size_t \fBstack_index_size\fP = 0"
+.br
+.RI "phantom documentation used to test the functioning of doxygen "
+.in -1c
+.SH "Function Documentation"
+.PP
+.SS "GtkWidget * create_axis_slider (int axis)"
+
+.PP
+Creates a slider widget\&.
+.PP
+\fBParameters\fP
+.RS 4
+\fIaxis\fP the axis we're building a label for
+.RE
+.PP
+\fBReturns\fP
+.RS 4
+GtkWidget*: pointer to the new widget
+.RE
+.PP
+
+.SS "long util_gl_get_stack (void * container_widget)"
+
+.PP
+Look for stack entry and returns stack_id\&.
+.PP
+\fBParameters\fP
+.RS 4
+\fIcontainer_widget\fP generally the GtkBox that contains the GLArea
+.RE
+.PP
+\fBReturns\fP
+.RS 4
+stack_id
+.RE
+.PP
+
+.SS "bool util_gl_init_stack (void * container_widget, GError * error_buffer)"
+
+.PP
+Look for stack entry and initializes OpenGL for it\&.
+.PP
+\fBParameters\fP
+.RS 4
+\fIcontainer_widget\fP generally the GtkBox that contains the GLArea
+.br
+\fIerror_buffer\fP phantom documentation used to test the functioning of doxygen
+.RE
+.PP
+\fBReturns\fP
+.RS 4
+bool: true if success
+.RE
+.PP
+
+.SS "long util_gl_is_ready (void * container_widget)"
+
+.PP
+Look for stack entry and returns stack_id\&.
+.PP
+\fBParameters\fP
+.RS 4
+\fIcontainer_widget\fP generally the GtkBox that contains the GLArea
+.RE
+.PP
+\fBReturns\fP
+.RS 4
+stack_id
+.RE
+.PP
+
+.SS "bool util_gl_render_stack (GtkWidget * container_widget)"
+
+.PP
+Look for stack entry and triggers OpenGL for drawing\&.
+.PP
+\fBParameters\fP
+.RS 4
+\fIcontainer_widget\fP generally the GtkBox that contains the GLArea
+.RE
+.PP
+\fBReturns\fP
+.RS 4
+bool: true if success
+.RE
+.PP
+
+.SS "void util_gl_shutdown_all_stacks (void)"
+
+.PP
+Look for every stack entry and shutdowns OpenGL for it\&. returns true if success ? TODO why not bool ?
+.SS "bool util_gl_shutdown_stack (void * container_widget, GError * error_buffer)"
+
+.PP
+Look for stack entry and shutdowns OpenGL for it\&.
+.PP
+\fBParameters\fP
+.RS 4
+\fIcontainer_widget\fP generally the GtkBox that contains the GLArea
+.br
+\fIerror_buffer\fP phantom documentation used to test the functioning of doxygen
+.RE
+.PP
+\fBReturns\fP
+.RS 4
+bool: true if success
+.RE
+.PP
+
+.SS "bool util_gl_update_axis (GtkWidget * container_widget, int axis, int value)"
+
+.PP
+Look for stack entry and triggers OpenGL for drawing\&.
+.PP
+\fBParameters\fP
+.RS 4
+\fIcontainer_widget\fP generally the GtkBox that contains the GLArea
+.br
+\fIaxis\fP phantom documentation used to test the functioning of doxygen
+.br
+\fIvalue\fP phantom documentation used to test the functioning of doxygen
+.RE
+.PP
+\fBReturns\fP
+.RS 4
+bool: true if success
+.RE
+.PP
+
+.SH "Author"
+.PP
+Generated automatically by Doxygen for Gem-graph from the source code\&.
diff --git a/doc/rtfm/man3/gl_area.3 b/doc/rtfm/man3/gl_area.3
new file mode 100644
index 0000000..4a92a9f
--- /dev/null
+++ b/doc/rtfm/man3/gl_area.3
@@ -0,0 +1 @@
+.so man3/stack_index_t.3
diff --git a/doc/rtfm/man3/graphics_stack_t.3 b/doc/rtfm/man3/graphics_stack_t.3
new file mode 100644
index 0000000..3fee75d
--- /dev/null
+++ b/doc/rtfm/man3/graphics_stack_t.3
@@ -0,0 +1,132 @@
+.TH "graphics_stack_t" 3 "Version 0.1.0" "Gem-graph" \" -*- nroff -*-
+.ad l
+.nh
+.SH NAME
+graphics_stack_t \- Structure describing a gl_area and its parameters, used to create a table of Gem-graph client current gl_areas\&.
+
+.SH SYNOPSIS
+.br
+.PP
+.PP
+\fC#include \fP
+.SS "Public Attributes"
+
+.in +1c
+.ti -1c
+.RI "int \fBid\fP"
+.br
+.RI "phantom documentation "
+.ti -1c
+.RI "int \fBmode\fP"
+.br
+.RI "phantom documentation "
+.ti -1c
+.RI "float \fBrotation_angles\fP [N_AXIS]"
+.br
+.RI "Rotation angles on each axis\&. "
+.ti -1c
+.RI "GLuint \fBvao\fP"
+.br
+.RI "init_buffers
+.br
+ "
+.ti -1c
+.RI "GLuint \fBposition_buffer\fP"
+.br
+.RI "shutdown, draw
+.br
+ "
+.ti -1c
+.RI "GLuint \fBcolor_buffer\fP"
+.br
+.RI "shutdown, draw
+.br
+ "
+.ti -1c
+.RI "GLuint \fBprogram\fP"
+.br
+.RI "shutdown, init_shaders, draw
+.br
+ "
+.ti -1c
+.RI "GLuint \fBm\fP"
+.br
+.RI "init_shaders, draw
+.br
+ "
+.ti -1c
+.RI "GLuint \fBv\fP"
+.br
+.RI "init_shaders, draw
+.br
+ "
+.ti -1c
+.RI "GLuint \fBp\fP"
+.br
+.RI "init_shaders, draw
+.br
+ "
+.ti -1c
+.RI "struct \fBarrow_t\fP * \fBarrows_ptr\fP"
+.br
+.RI "phantom documentation "
+.ti -1c
+.RI "long \fBarrows_nb\fP"
+.br
+.RI "phantom documentation "
+.ti -1c
+.RI "GLfloat * \fBbuffer_vertex_origin\fP"
+.br
+.RI "phantom documentation "
+.ti -1c
+.RI "GLfloat * \fBbuffer_colors_origin\fP"
+.br
+.RI "phantom documentation "
+.ti -1c
+.RI "GLuint * \fBbuffer_lines_origin\fP"
+.br
+.RI "phantom documentation "
+.ti -1c
+.RI "GLuint * \fBbuffer_plans_origin\fP"
+.br
+.RI "phantom documentation "
+.ti -1c
+.RI "long \fBbuffer_vertex_size\fP"
+.br
+.RI "phantom documentation "
+.ti -1c
+.RI "long \fBbuffer_colors_size\fP"
+.br
+.RI "phantom documentation "
+.ti -1c
+.RI "long \fBbuffer_lines_size\fP"
+.br
+.RI "phantom documentation "
+.ti -1c
+.RI "long \fBbuffer_plans_size\fP"
+.br
+.RI "phantom documentation "
+.ti -1c
+.RI "long \fBbuffer_vertex_0_arrow\fP"
+.br
+.RI "phantom documentation "
+.ti -1c
+.RI "long \fBbuffer_colors_0_arrow\fP"
+.br
+.RI "phantom documentation "
+.ti -1c
+.RI "long \fBbuffer_lines_0_arrow\fP"
+.br
+.RI "phantom documentation "
+.ti -1c
+.RI "long \fBbuffer_plans_0_arrow\fP"
+.br
+.RI "phantom documentation "
+.in -1c
+.SH "Detailed Description"
+.PP
+Structure describing a gl_area and its parameters, used to create a table of Gem-graph client current gl_areas\&.
+
+.SH "Author"
+.PP
+Generated automatically by Doxygen for Gem-graph from the source code\&.
diff --git a/doc/rtfm/man3/id.3 b/doc/rtfm/man3/id.3
new file mode 100644
index 0000000..2ecd9c0
--- /dev/null
+++ b/doc/rtfm/man3/id.3
@@ -0,0 +1 @@
+.so man3/graphics_stack_t.3
diff --git a/doc/rtfm/man3/last.3 b/doc/rtfm/man3/last.3
new file mode 100644
index 0000000..92b313e
--- /dev/null
+++ b/doc/rtfm/man3/last.3
@@ -0,0 +1 @@
+.so man3/dblist.3
diff --git a/doc/rtfm/man3/load.3 b/doc/rtfm/man3/load.3
new file mode 100644
index 0000000..c62e74b
--- /dev/null
+++ b/doc/rtfm/man3/load.3
@@ -0,0 +1 @@
+.so man3/arrow_t.3
diff --git a/doc/rtfm/man3/m.3 b/doc/rtfm/man3/m.3
new file mode 100644
index 0000000..2ecd9c0
--- /dev/null
+++ b/doc/rtfm/man3/m.3
@@ -0,0 +1 @@
+.so man3/graphics_stack_t.3
diff --git a/doc/rtfm/man3/main.3 b/doc/rtfm/man3/main.3
new file mode 100644
index 0000000..fe02294
--- /dev/null
+++ b/doc/rtfm/man3/main.3
@@ -0,0 +1 @@
+.so man3/main.c.3
diff --git a/doc/rtfm/man3/main.c.3 b/doc/rtfm/man3/main.c.3
new file mode 100644
index 0000000..da97e36
--- /dev/null
+++ b/doc/rtfm/man3/main.c.3
@@ -0,0 +1,131 @@
+.TH "src/main.c" 3 "Version 0.1.0" "Gem-graph" \" -*- nroff -*-
+.ad l
+.nh
+.SH NAME
+src/main.c \- Gem-graph client Main functions\&.
+
+.SH SYNOPSIS
+.br
+.PP
+\fC#include '\&.\&./include/widget\&.h'\fP
+.br
+\fC#include '\&.\&./include/signal\&.h'\fP
+.br
+\fC#include '\&.\&./include/fsm\&.h'\fP
+.br
+
+.SS "Functions"
+
+.in +1c
+.ti -1c
+.RI "int \fBmain\fP (int argc, char **argv)"
+.br
+.RI "gem-graph-client \fBmain()\fP "
+.in -1c
+.SH "Detailed Description"
+.PP
+Gem-graph client Main functions\&.
+
+Copyright © 2021 Libre en Communs contact@a-lec.org Copyright © 2021 Arthur Menges arthur.menges@a-lec.org Copyright © 2021-2024 Adrien Bourmault neox@a-lec.org Copyright © 2021-2024 Jean Sirmai jean@a-lec.org
+.PP
+This file is part of Gem-graph\&. This program is free software: you can redistribute it and/or modify it under the terms of the GNU Affero General Public License as published by the Free Software Foundation, either version 3 of the License, or (at your option) any later version\&.
+.PP
+This program is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE\&. See the GNU Affero General Public License for more details\&.
+.PP
+You should have received a copy of the GNU Affero General Public License along with this program\&. If not, see http://www.gnu.org/licenses/\&.
+.PP
+gem-graph-client main file
+.PP
+Sur quel modèle se guider pour structurer le client gem-graph ?
+.PP
+https://en.wikipedia.org/wiki/Model%E2%80%93view%E2%80%93viewmodel https://en.wikipedia.org/wiki/Multitier_architecture
+.PP
+ORGANISATION ACTUELLE (Octobre 2024)
+.SS "1) Les structures hierarchiques\&."
+La description du 'design' des fenêtres se trouve dans le dossier 'widget' et s'organise naturellement en arborescence, en se calquant sur l'arborescence des widgets eux-mêmes\&.
+.PP
+Il sera donc facile de répartir cette description en dossiers et fichiers au fur à mesure de son développement\&.
+.PP
+Actuellement, par exemple, la fenêtre principale comporte :
+.PP
+.RS 4
+une barre de titre (décrite dans 'topbar') et un widget 'child' (la partie sous la barre de titre) qui peut prendre au moins trois apparences différentes :
+.IP "\(bu" 2
+state (montre l'état de l'espace et les commandes associées)
+.IP "\(bu" 2
+rules (les règles et les commandes associées)
+.IP "\(bu" 2
+stock (les données provenant des mesures, les outils d'analyse, etc\&.) (nom provisoire : mal défini à ce stade; fonctions à répartir\&.\&.\&.)
+.PP
+.RE
+.PP
+La fenêtre principale s'ouvre sur la vue de l'état ('state\&.c') en mode 'EXEC'\&. Cette vue comporte trois panneaux (widgets) principaux: sup, moyen, inf ou encore: CONTRAST, CAMERA, CONTROL ou EDIT si on veut les nommer d'après leur fonction\&.
+.PP
+Lorsque la description de chaque widget s'affinera et demandera plus de place, ces trois widgets principaux deviendront des dossiers et les widgets qu'ils contiennent des fichiers (ou des dossiers si besoin) et ainsi de suite\&.\&.\&.
+.SS "2) Les structures transversales\&."
+Les fonctions 'transversales' comme celles de 'graphics', 'parse', 'fsm', 'prefer', et peut-être des structures communes à tous les arbres, listes, etc\&. doivent pouvoir être accédées directement sans avoir à passer par la hiérarchie des widgets et/ou callbacks\&. Elles restent à la racine: 'src/
+.PP
+'finite state machine' ('fsm') va centraliser l'identification des états (apparences) de la fenêtre et des transitions entre ces apparences; Elle sera probablement décomposée en de nombreux 'sous-automates' tels que chaque état de la fenêtre soit une combinaison unique des états de ces sous-automates\&.
+.PP
+Exemple, muni des deux 'sous-automates' :
+.PP
+.RS 4
+ { EXEC, EDIT }; // xor { STATE, RULES, DATA }; // xor
+.RE
+.PP
+la 'finite state machine' peut se trouver dans 2 x 3 = 6 états\&. (voir fsm\&.h lignes 40-41)
+.PP
+Les grandes fonctions du client seront lancées par cette state machine :
+.IP "\(bu" 2
+édition automatique (optimisation) de l'arbre des conditions
+.IP "\(bu" 2
+tests sur un mini-serveur local
+.IP "\(bu" 2
+analyses de données\&.\&.\&.
+.PP
+.PP
+Leur recueil et la mémorisation des préférences des utilisateurs sont des fonctions centrales mais leur mise en oeuvre suivra probalement des voies hiérarchiques\&.
+.PP
+On peut prévoir des préférences concernant l'apparence des widgets, les traductions, les 'disabilities'; etc\&. mais aussi concernant les méthodes de travail, l'usage des outils d'analyse, etc\&. >> des 'scripts' pour des 'méta-fonctions' (des 'macros') ?
+.SH "Function Documentation"
+.PP
+.SS "int main (int argc, char ** argv)"
+
+.PP
+gem-graph-client \fBmain()\fP
+.PP
+\fBDate\fP
+.RS 4
+2024-04
+.RE
+.PP
+\fBAuthor\fP
+.RS 4
+Jean
+.RE
+.PP
+\fBSee also\fP
+.RS 4
+src/fsm/dispatch
+.PP
+src/signal
+.PP
+(none)
+.RE
+.PP
+\fBParameters\fP
+.RS 4
+\fIargc\fP
+.br
+\fI**argv\fP
+.RE
+.PP
+\fBReturns\fP
+.RS 4
+status
+.RE
+.PP
+
+.SH "Author"
+.PP
+Generated automatically by Doxygen for Gem-graph from the source code\&.
diff --git a/doc/rtfm/man3/manager.c.3 b/doc/rtfm/man3/manager.c.3
new file mode 100644
index 0000000..5385f9e
--- /dev/null
+++ b/doc/rtfm/man3/manager.c.3
@@ -0,0 +1,58 @@
+.TH "src/fsm/preferences/manager.c" 3 "Version 0.1.0" "Gem-graph" \" -*- nroff -*-
+.ad l
+.nh
+.SH NAME
+src/fsm/preferences/manager.c
+.SH SYNOPSIS
+.br
+.PP
+\fC#include '\&.\&./\&.\&./\&.\&./include/fsm\&.h'\fP
+.br
+\fC#include '\&.\&./\&.\&./\&.\&./include/signal\&.h'\fP
+.br
+\fC#include '\&.\&./\&.\&./\&.\&./include/widget\&.h'\fP
+.br
+
+.SS "Classes"
+
+.in +1c
+.ti -1c
+.RI "struct \fBpreferences\fP"
+.br
+.RI "use this ? static const char *icon_name [3] = { 'document-revert-rtl-symbolic', 'edit-undo-symbolic', 'view-refresh-symbolic' }; "
+.in -1c
+.SS "Functions"
+
+.in +1c
+.ti -1c
+.RI "void \fBfsm_set_store_restore_reset\fP (int choice, int value)"
+.br
+.RI "phantom documentation used to test the functioning of doxygen "
+.ti -1c
+.RI "void \fBfsm_reset_all_situations_values\fP (int value)"
+.br
+.RI "phantom documentation used to test the functioning of doxygen "
+.ti -1c
+.RI "void \fBfsm_add_displayable\fP (char *displayable_name)"
+.br
+.RI "phantom documentation used to test the functioning of doxygen "
+.ti -1c
+.RI "void \fBfsm_list_init_preferences\fP ()"
+.br
+.RI "phantom documentation used to test the functioning of doxygen "
+.ti -1c
+.RI "void \fBfsm_list_init_displayables\fP ()"
+.br
+.RI "phantom documentation used to test the functioning of doxygen "
+.in -1c
+.SS "Variables"
+
+.in +1c
+.ti -1c
+.RI "struct \fBpreferences\fP * \fBpref_jean\fP = NULL"
+.br
+.RI "phantom documentation used to test the functioning of doxygen "
+.in -1c
+.SH "Author"
+.PP
+Generated automatically by Doxygen for Gem-graph from the source code\&.
diff --git a/doc/rtfm/man3/mode.3 b/doc/rtfm/man3/mode.3
new file mode 100644
index 0000000..2ecd9c0
--- /dev/null
+++ b/doc/rtfm/man3/mode.3
@@ -0,0 +1 @@
+.so man3/graphics_stack_t.3
diff --git a/doc/rtfm/man3/next.3 b/doc/rtfm/man3/next.3
new file mode 100644
index 0000000..22a462d
--- /dev/null
+++ b/doc/rtfm/man3/next.3
@@ -0,0 +1 @@
+.so man3/elem.3
diff --git a/doc/rtfm/man3/p.3 b/doc/rtfm/man3/p.3
new file mode 100644
index 0000000..2ecd9c0
--- /dev/null
+++ b/doc/rtfm/man3/p.3
@@ -0,0 +1 @@
+.so man3/graphics_stack_t.3
diff --git a/doc/rtfm/man3/pile.3 b/doc/rtfm/man3/pile.3
new file mode 100644
index 0000000..dc8d8ff
--- /dev/null
+++ b/doc/rtfm/man3/pile.3
@@ -0,0 +1,30 @@
+.TH "pile" 3 "Version 0.1.0" "Gem-graph" \" -*- nroff -*-
+.ad l
+.nh
+.SH NAME
+pile \- phantom documentation used to test the functioning of doxygen
+
+.SH SYNOPSIS
+.br
+.PP
+.PP
+\fC#include \fP
+.SS "Public Attributes"
+
+.in +1c
+.ti -1c
+.RI "int \fBvalue\fP"
+.br
+.RI "value phantom documentation "
+.ti -1c
+.RI "struct \fBpile\fP * \fBprev\fP"
+.br
+.RI "*prev phantom documentation "
+.in -1c
+.SH "Detailed Description"
+.PP
+phantom documentation used to test the functioning of doxygen
+
+.SH "Author"
+.PP
+Generated automatically by Doxygen for Gem-graph from the source code\&.
diff --git a/doc/rtfm/man3/position_buffer.3 b/doc/rtfm/man3/position_buffer.3
new file mode 100644
index 0000000..2ecd9c0
--- /dev/null
+++ b/doc/rtfm/man3/position_buffer.3
@@ -0,0 +1 @@
+.so man3/graphics_stack_t.3
diff --git a/doc/rtfm/man3/pref_jean.3 b/doc/rtfm/man3/pref_jean.3
new file mode 100644
index 0000000..5760f47
--- /dev/null
+++ b/doc/rtfm/man3/pref_jean.3
@@ -0,0 +1 @@
+.so man3/manager.c.3
diff --git a/doc/rtfm/man3/preferences.3 b/doc/rtfm/man3/preferences.3
new file mode 100644
index 0000000..f88d4fe
--- /dev/null
+++ b/doc/rtfm/man3/preferences.3
@@ -0,0 +1,26 @@
+.TH "preferences" 3 "Version 0.1.0" "Gem-graph" \" -*- nroff -*-
+.ad l
+.nh
+.SH NAME
+preferences \- use this ? static const char *icon_name [3] = { 'document-revert-rtl-symbolic', 'edit-undo-symbolic', 'view-refresh-symbolic' };
+
+.SH SYNOPSIS
+.br
+.PP
+.SS "Public Attributes"
+
+.in +1c
+.ti -1c
+.RI "int \fBtransparency\fP [n_objects]"
+.br
+.RI "transparency [n_objects] phantom documentation "
+.in -1c
+.SH "Detailed Description"
+.PP
+use this ? static const char *icon_name [3] = { 'document-revert-rtl-symbolic', 'edit-undo-symbolic', 'view-refresh-symbolic' };
+
+const char \fIfsm_get_button_icon_name (int n) {return (const char\fP) icon_name [n];} phantom documentation used to test the functioning of doxygen
+
+.SH "Author"
+.PP
+Generated automatically by Doxygen for Gem-graph from the source code\&.
diff --git a/doc/rtfm/man3/prev.3 b/doc/rtfm/man3/prev.3
new file mode 100644
index 0000000..22a462d
--- /dev/null
+++ b/doc/rtfm/man3/prev.3
@@ -0,0 +1 @@
+.so man3/elem.3
diff --git a/doc/rtfm/man3/program.3 b/doc/rtfm/man3/program.3
new file mode 100644
index 0000000..2ecd9c0
--- /dev/null
+++ b/doc/rtfm/man3/program.3
@@ -0,0 +1 @@
+.so man3/graphics_stack_t.3
diff --git a/doc/rtfm/man3/rotation_angles.3 b/doc/rtfm/man3/rotation_angles.3
new file mode 100644
index 0000000..2ecd9c0
--- /dev/null
+++ b/doc/rtfm/man3/rotation_angles.3
@@ -0,0 +1 @@
+.so man3/graphics_stack_t.3
diff --git a/doc/rtfm/man3/site.3 b/doc/rtfm/man3/site.3
new file mode 100644
index 0000000..c62e74b
--- /dev/null
+++ b/doc/rtfm/man3/site.3
@@ -0,0 +1 @@
+.so man3/arrow_t.3
diff --git a/doc/rtfm/man3/slist.3 b/doc/rtfm/man3/slist.3
new file mode 100644
index 0000000..1818c68
--- /dev/null
+++ b/doc/rtfm/man3/slist.3
@@ -0,0 +1,30 @@
+.TH "slist" 3 "Version 0.1.0" "Gem-graph" \" -*- nroff -*-
+.ad l
+.nh
+.SH NAME
+slist \- phantom documentation used to test the functioning of doxygen
+
+.SH SYNOPSIS
+.br
+.PP
+.PP
+\fC#include \fP
+.SS "Public Attributes"
+
+.in +1c
+.ti -1c
+.RI "int \fBvalue\fP"
+.br
+.RI "value phantom documentation "
+.ti -1c
+.RI "struct \fBslist\fP * \fBsuiv\fP"
+.br
+.RI "*suiv phantom documentation "
+.in -1c
+.SH "Detailed Description"
+.PP
+phantom documentation used to test the functioning of doxygen
+
+.SH "Author"
+.PP
+Generated automatically by Doxygen for Gem-graph from the source code\&.
diff --git a/doc/rtfm/man3/stack_id.3 b/doc/rtfm/man3/stack_id.3
new file mode 100644
index 0000000..4a92a9f
--- /dev/null
+++ b/doc/rtfm/man3/stack_id.3
@@ -0,0 +1 @@
+.so man3/stack_index_t.3
diff --git a/doc/rtfm/man3/stack_index_size.3 b/doc/rtfm/man3/stack_index_size.3
new file mode 100644
index 0000000..16745d6
--- /dev/null
+++ b/doc/rtfm/man3/stack_index_size.3
@@ -0,0 +1 @@
+.so man3/gl.c.3
diff --git a/doc/rtfm/man3/stack_index_t.3 b/doc/rtfm/man3/stack_index_t.3
new file mode 100644
index 0000000..18e0994
--- /dev/null
+++ b/doc/rtfm/man3/stack_index_t.3
@@ -0,0 +1,32 @@
+.TH "stack_index_t" 3 "Version 0.1.0" "Gem-graph" \" -*- nroff -*-
+.ad l
+.nh
+.SH NAME
+stack_index_t \- phantom documentation used to test the functioning of doxygen
+
+.SH SYNOPSIS
+.br
+.PP
+.SS "Public Attributes"
+
+.in +1c
+.ti -1c
+.RI "long \fBstack_id\fP"
+.br
+.RI "stack_id phantom documentation "
+.ti -1c
+.RI "void * \fBcontainer_widget\fP"
+.br
+.RI "container_widget phantom documentation "
+.ti -1c
+.RI "void * \fBgl_area\fP"
+.br
+.RI "gl_area phantom documentation "
+.in -1c
+.SH "Detailed Description"
+.PP
+phantom documentation used to test the functioning of doxygen
+
+.SH "Author"
+.PP
+Generated automatically by Doxygen for Gem-graph from the source code\&.
diff --git a/doc/rtfm/man3/string_value.3 b/doc/rtfm/man3/string_value.3
new file mode 100644
index 0000000..a89bde9
--- /dev/null
+++ b/doc/rtfm/man3/string_value.3
@@ -0,0 +1 @@
+.so man3/fsm_struct_journal_unit.3
diff --git a/doc/rtfm/man3/suiv.3 b/doc/rtfm/man3/suiv.3
new file mode 100644
index 0000000..15b17a4
--- /dev/null
+++ b/doc/rtfm/man3/suiv.3
@@ -0,0 +1 @@
+.so man3/fsm_struct_list_data.3
diff --git a/doc/rtfm/man3/text.3 b/doc/rtfm/man3/text.3
new file mode 100644
index 0000000..b0592f6
--- /dev/null
+++ b/doc/rtfm/man3/text.3
@@ -0,0 +1 @@
+.so man3/TreeNode_t.3
diff --git a/doc/rtfm/man3/top.3 b/doc/rtfm/man3/top.3
new file mode 100644
index 0000000..25d78db
--- /dev/null
+++ b/doc/rtfm/man3/top.3
@@ -0,0 +1 @@
+.so man3/Stack.3
diff --git a/doc/rtfm/man3/transparency.3 b/doc/rtfm/man3/transparency.3
new file mode 100644
index 0000000..a4e968c
--- /dev/null
+++ b/doc/rtfm/man3/transparency.3
@@ -0,0 +1 @@
+.so man3/preferences.3
diff --git a/doc/rtfm/man3/usec.3 b/doc/rtfm/man3/usec.3
new file mode 100644
index 0000000..a89bde9
--- /dev/null
+++ b/doc/rtfm/man3/usec.3
@@ -0,0 +1 @@
+.so man3/fsm_struct_journal_unit.3
diff --git a/doc/rtfm/man3/util_gl_clean_stack_index.3 b/doc/rtfm/man3/util_gl_clean_stack_index.3
new file mode 100644
index 0000000..16745d6
--- /dev/null
+++ b/doc/rtfm/man3/util_gl_clean_stack_index.3
@@ -0,0 +1 @@
+.so man3/gl.c.3
diff --git a/doc/rtfm/man3/util_gl_get_stack.3 b/doc/rtfm/man3/util_gl_get_stack.3
new file mode 100644
index 0000000..16745d6
--- /dev/null
+++ b/doc/rtfm/man3/util_gl_get_stack.3
@@ -0,0 +1 @@
+.so man3/gl.c.3
diff --git a/doc/rtfm/man3/util_gl_init_stack.3 b/doc/rtfm/man3/util_gl_init_stack.3
new file mode 100644
index 0000000..16745d6
--- /dev/null
+++ b/doc/rtfm/man3/util_gl_init_stack.3
@@ -0,0 +1 @@
+.so man3/gl.c.3
diff --git a/doc/rtfm/man3/util_gl_is_ready.3 b/doc/rtfm/man3/util_gl_is_ready.3
new file mode 100644
index 0000000..16745d6
--- /dev/null
+++ b/doc/rtfm/man3/util_gl_is_ready.3
@@ -0,0 +1 @@
+.so man3/gl.c.3
diff --git a/doc/rtfm/man3/util_gl_render_stack.3 b/doc/rtfm/man3/util_gl_render_stack.3
new file mode 100644
index 0000000..16745d6
--- /dev/null
+++ b/doc/rtfm/man3/util_gl_render_stack.3
@@ -0,0 +1 @@
+.so man3/gl.c.3
diff --git a/doc/rtfm/man3/util_gl_set_arrow.3 b/doc/rtfm/man3/util_gl_set_arrow.3
new file mode 100644
index 0000000..16745d6
--- /dev/null
+++ b/doc/rtfm/man3/util_gl_set_arrow.3
@@ -0,0 +1 @@
+.so man3/gl.c.3
diff --git a/doc/rtfm/man3/util_gl_setup_glarea.3 b/doc/rtfm/man3/util_gl_setup_glarea.3
new file mode 100644
index 0000000..16745d6
--- /dev/null
+++ b/doc/rtfm/man3/util_gl_setup_glarea.3
@@ -0,0 +1 @@
+.so man3/gl.c.3
diff --git a/doc/rtfm/man3/util_gl_shutdown_all_stacks.3 b/doc/rtfm/man3/util_gl_shutdown_all_stacks.3
new file mode 100644
index 0000000..16745d6
--- /dev/null
+++ b/doc/rtfm/man3/util_gl_shutdown_all_stacks.3
@@ -0,0 +1 @@
+.so man3/gl.c.3
diff --git a/doc/rtfm/man3/util_gl_shutdown_stack.3 b/doc/rtfm/man3/util_gl_shutdown_stack.3
new file mode 100644
index 0000000..16745d6
--- /dev/null
+++ b/doc/rtfm/man3/util_gl_shutdown_stack.3
@@ -0,0 +1 @@
+.so man3/gl.c.3
diff --git a/doc/rtfm/man3/util_gl_update_axis.3 b/doc/rtfm/man3/util_gl_update_axis.3
new file mode 100644
index 0000000..16745d6
--- /dev/null
+++ b/doc/rtfm/man3/util_gl_update_axis.3
@@ -0,0 +1 @@
+.so man3/gl.c.3
diff --git a/doc/rtfm/man3/v.3 b/doc/rtfm/man3/v.3
new file mode 100644
index 0000000..2ecd9c0
--- /dev/null
+++ b/doc/rtfm/man3/v.3
@@ -0,0 +1 @@
+.so man3/graphics_stack_t.3
diff --git a/doc/rtfm/man3/value.3 b/doc/rtfm/man3/value.3
new file mode 100644
index 0000000..22a462d
--- /dev/null
+++ b/doc/rtfm/man3/value.3
@@ -0,0 +1 @@
+.so man3/elem.3
diff --git a/doc/rtfm/man3/vao.3 b/doc/rtfm/man3/vao.3
new file mode 100644
index 0000000..2ecd9c0
--- /dev/null
+++ b/doc/rtfm/man3/vao.3
@@ -0,0 +1 @@
+.so man3/graphics_stack_t.3
diff --git a/doc/rtfm/man3/x.3 b/doc/rtfm/man3/x.3
new file mode 100644
index 0000000..c62e74b
--- /dev/null
+++ b/doc/rtfm/man3/x.3
@@ -0,0 +1 @@
+.so man3/arrow_t.3
diff --git a/doc/rtfm/man3/y.3 b/doc/rtfm/man3/y.3
new file mode 100644
index 0000000..c62e74b
--- /dev/null
+++ b/doc/rtfm/man3/y.3
@@ -0,0 +1 @@
+.so man3/arrow_t.3
diff --git a/doc/rtfm/man3/yy_dd_mm.3 b/doc/rtfm/man3/yy_dd_mm.3
new file mode 100644
index 0000000..a89bde9
--- /dev/null
+++ b/doc/rtfm/man3/yy_dd_mm.3
@@ -0,0 +1 @@
+.so man3/fsm_struct_journal_unit.3
diff --git a/doc/rtfm/man3/z.3 b/doc/rtfm/man3/z.3
new file mode 100644
index 0000000..c62e74b
--- /dev/null
+++ b/doc/rtfm/man3/z.3
@@ -0,0 +1 @@
+.so man3/arrow_t.3
diff --git a/doc/sqlite3/doxygen_sqlite3.db b/doc/sqlite3/doxygen_sqlite3.db
new file mode 100644
index 0000000..1604cec
Binary files /dev/null and b/doc/sqlite3/doxygen_sqlite3.db differ
diff --git a/src/fsm/dispatch.c b/src/fsm/dispatch.c
index beefebf..e06c028 100644
--- a/src/fsm/dispatch.c
+++ b/src/fsm/dispatch.c
@@ -51,7 +51,7 @@
* describes all the possible states of the Gem-graph client
* and all the transitions between these states.
*
- * @details gem-graph-client fsm (Finite State Machine) manages the four topics:
+ * @details gem-graph-client fsm (Finite State Machine) manages four topics:
* - engine (window appearance)
* - measures (current measurements)
* - results (current data acquisition and displays)
@@ -78,15 +78,22 @@
static fsm_struct_journal gg_logs;
/**
- * @brief The log is modified for each event but is only published once, before
- * the end of "main()", in order to guarantee its chronological order.
+ * @brief The fsm_journal_publication_request() is called only once,
+ * by main(), just after closing the app and before ending the program.
+ * This is to guarantee the chronological order of the events in the journal.
*
- * @details The fsm_journal_publication_request() is called only once,
- * by 'main.c' just before ending and returning its status.
- * Therefore, src/journal.c/fsm_journal_publish() (called here)
+ * @details The log is modified for each event
+ * but events can be send asynchronously.
+ * This is why the journal is only published once,
+ * before the end of "main()",
+ * Its chronological order is therefore guaranteed.
+ *
+ * src/journal.c/fsm_journal_publish() (called here)
* is the last function of the program to be executed.
- * Also, it is safer to keep only one static instance
- * of the fsm_struct_journal here to avoid uncontrolled operations on it.
+ *
+ * The fsm_struct_journal (gg_logs) is a static instance in this file.
+ * Therefore, all the functions that read or write it are in this file.
+ * This is to avoid uncontrolled operations on it.
*
* @date 2024-08
* @author Jean
@@ -98,8 +105,9 @@ static fsm_struct_journal gg_logs;
*/
void fsm_journal_publication_request() {fsm_journal_publish (gg_logs);}
+
/**
- * @brief It is mandatory for an event to call this function
+ * @brief It is mandatory for any event to call this function
* to be published in the journal.
* Before publication, a filter can be applied here (and only here)
* to select only some events of interest (during debugging, for example).
@@ -109,6 +117,7 @@ void fsm_journal_publication_request() {fsm_journal_publish (gg_logs);}
*
* This filter can operate on any the following five parameters:
* severity, source, *file_source, *function_source, *string_value.
+ * @see below (params)
*
* Simple filters (on a single parameter) can be combined
* using the logical operators 'and' and 'or' and parentheses.
@@ -141,13 +150,13 @@ void fsm_journal_publication_request() {fsm_journal_publish (gg_logs);}
* @see src/util/tree.c
* @see src/signal.c * 38
*
- * @param severity <> see enum fsm_enum_journal_severity in include/fsm.h
+ * @param severity <> @see enum fsm_enum_journal_severity in include/fsm.h
* 'severity' is a pre-defined value that must be associated to each event.
* It ranges from zero to six :
* CRITICAL ERROR WARNING INFO MESSAGE DEBUG SPEW
* 0 1 2 3 4 5 6
*
- * @param source <> see enum fsm_enum_journal_source in include/fsm.h
+ * @param source <> @see enum fsm_enum_journal_source in include/fsm.h
* 'source' is a pre-defined value that can be associated to each event.
* It is not mandatory. It can be set to 'NULL'.
*
@@ -177,7 +186,7 @@ void fsm_journal_event (int severity,
/**
* @brief This is the first function called by 'main.c'
- * It initiates the journal and the lists of:
+ * It initiates the journal and four lists which are:
* 'measures', 'results', 'displayables results' and 'preferences'.
* These lists will be used to define the current state of the fsm.
*
@@ -338,7 +347,7 @@ static char *tab_1 [] = { "SYNTH", "STATE", "RULES", "RESULTS" };
/**
- * @brief setter for the static value: 'choice_STATE_RULES_DATA'
+ * @brief setter for the static value: 'choice_STATE_RULES_DATA' (in this file)
* @details see include/fsm enum fsm_enum_exec_edit { EXEC, EDIT }
*
* @date 2024-08
@@ -362,7 +371,7 @@ void fsm_set_exec_edit (int choice)
}
/**
- * @brief setter for the static value: 'choice_STATE_RULES_DATA'
+ * @brief setter for the static value: 'choice_STATE_RULES_DATA' (in this file)
*
* @details see include/fsm enum
* fsm_enum_state_rules_data { SYNTH, STATE, RULES, DATA }
diff --git a/src/journal.c b/src/journal.c
index c0c78a9..51052ff 100644
--- a/src/journal.c
+++ b/src/journal.c
@@ -36,7 +36,7 @@
/* during a session run (rules exec, mainly) */
/******************************************************************************/
-/* 2024-09-22
+/** 2024-09-22
* What types of events should be reported ? (fsm, widgets, ... )
* For what purpose ?
* What information must be collected and transmitted ?
@@ -46,7 +46,7 @@
* date clé (rank) fichier source fonction source +/- valeur */
-/*
+/**
time_t current_time = time(NULL);
// Check if the time retrieval was successful
if (current_time == ((time_t)-1)) printf("Error getting current time.\n");
@@ -55,12 +55,38 @@
printf(" Current time: %s", ctime(¤t_time));
*/
+
+/**
+ * @brief
+ * @details
+ * @date
+ * @author
+ * @callgraph
+ * @see
+ * @callergraph
+ * @see
+ * @param
+ * @return
+ */
void fsm_journal_init (fsm_struct_journal *jj)
{
jj->first = NULL;
jj->last = NULL;
}
+
+/**
+ * @brief
+ * @details
+ * @date
+ * @author
+ * @callgraph
+ * @see
+ * @callergraph
+ * @see
+ * @param
+ * @return
+ */
void fsm_journal_clear (fsm_struct_journal *jj,
const char *file_source,
const char *function_source,
@@ -78,6 +104,19 @@ void fsm_journal_clear (fsm_struct_journal *jj,
jj->last = NULL;
}
+
+/**
+ * @brief
+ * @details
+ * @date
+ * @author
+ * @callgraph
+ * @see
+ * @callergraph
+ * @see
+ * @param
+ * @return
+ */
void fsm_journal_push_front (fsm_struct_journal *jj,
const char *file_source,
const char *function_source,
@@ -101,6 +140,19 @@ void fsm_journal_push_front (fsm_struct_journal *jj,
jj->first = new_unit;
}
+
+/**
+ * @brief
+ * @details
+ * @date
+ * @author
+ * @callgraph
+ * @see
+ * @callergraph
+ * @see
+ * @param
+ * @return
+ */
long fsm_journal_pop_back (fsm_struct_journal *jj,
const char *file_source,
const char *function_source,
@@ -117,6 +169,19 @@ long fsm_journal_pop_back (fsm_struct_journal *jj,
return usec; // retourne l'évènement retiré du journal.
}
+
+/**
+ * @brief
+ * @details
+ * @date
+ * @author
+ * @callgraph
+ * @see
+ * @callergraph
+ * @see
+ * @param
+ * @return
+ */
int fsm_journal_length (fsm_struct_journal jj)
{
fsm_struct_journal_unit *a_unit = jj.first;
@@ -130,6 +195,19 @@ int fsm_journal_length (fsm_struct_journal jj)
return nb;
}
+
+/**
+ * @brief
+ * @details
+ * @date
+ * @author
+ * @callgraph
+ * @see
+ * @callergraph
+ * @see
+ * @param
+ * @return
+ */
void fsm_journal_seek (fsm_struct_journal jj, long usec,
const char *file_source,
const char *function_source,
@@ -157,6 +235,19 @@ void fsm_journal_seek (fsm_struct_journal jj, long usec,
// https://mefics.org/fr/allocation-dynamique-de-m%C3%A9moire-en-c-fonctions-malloc-calloc/
//------------------------------------------------------------------------------
+
+/**
+ * @brief
+ * @details
+ * @date
+ * @author
+ * @callgraph
+ * @see
+ * @callergraph
+ * @see
+ * @param
+ * @return
+ */
void fsm_journal_publish (fsm_struct_journal jj)
{
fsm_struct_journal_unit *a_unit = jj.last;
diff --git a/src/main.c b/src/main.c
index 3549480..1e07f34 100644
--- a/src/main.c
+++ b/src/main.c
@@ -30,9 +30,7 @@
* @file
* @brief gem-graph-client main file
*
- * @details
- *
- * Sur quel modèle se guider pour structurer le client gem-graph ?
+ * @details Sur quel modèle se guider pour structurer le client gem-graph ?
*
* https://en.wikipedia.org/wiki/Model%E2%80%93view%E2%80%93viewmodel
* https://en.wikipedia.org/wiki/Multitier_architecture
diff --git a/src/signal.c b/src/signal.c
index e992cfe..ec48de3 100644
--- a/src/signal.c
+++ b/src/signal.c
@@ -78,6 +78,19 @@ void on_setup_user_tree_factory (GtkSignalListItemFactory *factory,
}
+
+/**
+ * @brief
+ * @details
+ * @date
+ * @author
+ * @callgraph
+ * @see
+ * @callergraph
+ * @see
+ * @param
+ * @return
+ */
void on_bind_user_tree_factory (GtkSignalListItemFactory *factory,
GObject* object,
gpointer user_data)
@@ -109,6 +122,19 @@ void on_bind_user_tree_factory (GtkSignalListItemFactory *factory,
/* G L A R E A */
/******************************************************************************/
+
+/**
+ * @brief
+ * @details
+ * @date
+ * @author
+ * @callgraph
+ * @see
+ * @callergraph
+ * @see
+ * @param
+ * @return
+ */
gboolean on_glarea_render (GtkGLArea *area,
GdkGLContext *context)
{
@@ -128,7 +154,20 @@ gboolean on_glarea_render (GtkGLArea *area,
}
-/* We need to set up our state when we realize the GtkGLArea widget */
+
+/**
+ * @brief
+ * @details
+ * @date
+ * @author
+ * @callgraph
+ * @see
+ * @callergraph
+ * @see
+ * @param
+ * @return
+ */
+/** We need to set up our state when we realize the GtkGLArea widget */
void on_glarea_realize (GtkWidget *widget)
{
fsm_journal_event (DEBUG, GLAREA, "signal", "glarea realize()", "");
@@ -154,7 +193,20 @@ void on_glarea_realize (GtkWidget *widget)
gtk_gl_area_set_auto_render(GTK_GL_AREA(widget), true);
}
-/* We should tear down the state when unrealizing */
+
+/**
+ * @brief
+ * @details
+ * @date
+ * @author
+ * @callgraph
+ * @see
+ * @callergraph
+ * @see
+ * @param
+ * @return
+ */
+/** We should tear down the state when unrealizing */
void on_glarea_unrealize (GtkWidget *widget)
{
fsm_journal_event (DEBUG, GLAREA, "signal", "glarea unrealize()", "");
@@ -178,6 +230,19 @@ void on_glarea_unrealize (GtkWidget *widget)
}
}
+
+/**
+ * @brief
+ * @details
+ * @date
+ * @author
+ * @callgraph
+ * @see
+ * @callergraph
+ * @see
+ * @param
+ * @return
+ */
void on_axis_value_change (GtkAdjustment *adjustment, gpointer data)
{
GtkWidget *slider = gtk_widget_get_parent(GTK_WIDGET(data));
@@ -217,6 +282,19 @@ void on_axis_value_change (GtkAdjustment *adjustment, gpointer data)
/* D I A L O G W I D G E T S */
/******************************************************************************/
+
+/**
+ * @brief
+ * @details
+ * @date
+ * @author
+ * @callgraph
+ * @see
+ * @callergraph
+ * @see
+ * @param
+ * @return
+ */
void on_save_current_model_before_editing (GtkWidget *btt_save_current_model,
gpointer data)
{
@@ -225,6 +303,19 @@ void on_save_current_model_before_editing (GtkWidget *btt_save_current_model,
gtk_widget_set_sensitive (GTK_WIDGET (data), TRUE);
}
+
+/**
+ * @brief
+ * @details
+ * @date
+ * @author
+ * @callgraph
+ * @see
+ * @callergraph
+ * @see
+ * @param
+ * @return
+ */
void on_discard_current_model_before_editing (GtkWidget *btt_discard_current_model,
gpointer data)
{
@@ -233,6 +324,19 @@ void on_discard_current_model_before_editing (GtkWidget *btt_discard_current_mod
gtk_window_close (GTK_WINDOW (data));
}
+
+/**
+ * @brief
+ * @details
+ * @date
+ * @author
+ * @callgraph
+ * @see
+ * @callergraph
+ * @see
+ * @param
+ * @return
+ */
void on_write_current_model (GtkWidget *btt_write_current_model,
gpointer data)
{
@@ -251,6 +355,19 @@ static void switch_state_rules_data();
// ----------------------- E X E C / E D I T -------------------------- //
+
+/**
+ * @brief
+ * @details
+ * @date
+ * @author
+ * @callgraph
+ * @see
+ * @callergraph
+ * @see
+ * @param
+ * @return
+ */
void on_toggle_exec_edit (GtkWidget *toggled_button, gpointer user_data)
{
fsm_journal_event (INFO, BUTTON, "signal", "toggle exec edit()",
@@ -283,6 +400,19 @@ void on_toggle_exec_edit (GtkWidget *toggled_button, gpointer user_data)
// ------------------ S T A T E / R U L E S / D A T A --------------- //
+
+/**
+ * @brief
+ * @details
+ * @date
+ * @author
+ * @callgraph
+ * @see
+ * @callergraph
+ * @see
+ * @param
+ * @return
+ */
void on_toggle_state_rules_data (GtkWidget *toggled_button, gpointer widget_all_vs_selected_one)
{
const char *toggled_button_name
@@ -361,6 +491,19 @@ static void switch_state_rules_data()
// ------------ M E N U / S E A R C H / H O M E / E T C ----------- //
+
+/**
+ * @brief
+ * @details
+ * @date
+ * @author
+ * @callgraph
+ * @see
+ * @callergraph
+ * @see
+ * @param
+ * @return
+ */
void on_clicked_topbar_right_search (GtkWidget *btt_menu, gpointer list_box)
{
fsm_journal_event (DEBUG, BUTTON, "signal", "(topbar right) search()", "");
@@ -370,6 +513,19 @@ void on_clicked_topbar_right_search (GtkWidget *btt_menu, gpointer list_box)
}
+
+/**
+ * @brief
+ * @details
+ * @date
+ * @author
+ * @callgraph
+ * @see
+ * @callergraph
+ * @see
+ * @param
+ * @return
+ */
void on_clicked_topbar_right_home (GtkWidget *btt_reset, gpointer data)
{
fsm_journal_event (DEBUG, BUTTON, "signal", "(topbar right) home()", "");
@@ -386,6 +542,19 @@ void on_clicked_topbar_right_home (GtkWidget *btt_reset, gpointer data)
// ---------------------------- O B J E C T S --------------------------- //
+
+/**
+ * @brief
+ * @details
+ * @date
+ * @author
+ * @callgraph
+ * @see
+ * @callergraph
+ * @see
+ * @param
+ * @return
+ */
void on_updating_objects_transparencies (GtkWidget *btt_source, GtkScrollbar *scrollbar)
{
const char *btt_name = gtk_button_get_icon_name (GTK_BUTTON (btt_source));
@@ -401,6 +570,19 @@ void on_updating_objects_transparencies (GtkWidget *btt_source, GtkScrollbar *sc
fsm_set_preferences_modified (TRUE); // << à détailler TODO
}
+
+/**
+ * @brief
+ * @details
+ * @date
+ * @author
+ * @callgraph
+ * @see
+ * @callergraph
+ * @see
+ * @param
+ * @return
+ */
void on_resetting_XYZ_in_state_page ()
{
fsm_journal_event (DEBUG, BUTTON, "signal", "resetting XYZ in state page()", "");
@@ -409,6 +591,19 @@ void on_resetting_XYZ_in_state_page ()
// -------------------------- S I T U A T I O N S ----------------------- //
+
+/**
+ * @brief
+ * @details
+ * @date
+ * @author
+ * @callgraph
+ * @see
+ * @callergraph
+ * @see
+ * @param
+ * @return
+ */
void on_situations_box_do_reset (GtkWidget *btt_reset, GtkScrollbar *reset_scrollbar)
{
GtkAdjustment *adj_situ = gtk_scrollbar_get_adjustment (reset_scrollbar);
@@ -423,6 +618,19 @@ void on_situations_box_do_reset (GtkWidget *btt_reset, GtkScrollbar *reset_scrol
/* M E A S U R E S */
/******************************************************************************/
+
+/**
+ * @brief
+ * @details
+ * @date
+ * @author
+ * @callgraph
+ * @see
+ * @callergraph
+ * @see
+ * @param
+ * @return
+ */
void on_topbar_right_measure_clicked (GtkWidget *btt, gpointer button_icon_name)
{
// ici, il faudrait surtout dire que: widget_get_measure_page
@@ -436,6 +644,19 @@ void on_topbar_right_measure_clicked (GtkWidget *btt, gpointer button_icon_name)
GTK_WIDGET (widget_get_page_measure()));
}
+
+/**
+ * @brief
+ * @details
+ * @date
+ * @author
+ * @callgraph
+ * @see
+ * @callergraph
+ * @see
+ * @param
+ * @return
+ */
void on_start_new_measure (GtkWidget *btt, gpointer btt_label)
{
fsm_journal_event (DEBUG, BUTTON, "signal", "start a new measure()", btt_label);
@@ -443,6 +664,19 @@ void on_start_new_measure (GtkWidget *btt, gpointer btt_label)
GTK_WIDGET (widget_measure_do_select_rules_first()));
}
+
+/**
+ * @brief
+ * @details
+ * @date
+ * @author
+ * @callgraph
+ * @see
+ * @callergraph
+ * @see
+ * @param
+ * @return
+ */
void on_select_rules_first (GtkWidget *btt, gpointer data)
{
fsm_journal_event (DEBUG, BUTTON, "signal", "select rules first()", "");
diff --git a/src/widget/dispatch.c b/src/widget/dispatch.c
index bf01a55..54d99cd 100644
--- a/src/widget/dispatch.c
+++ b/src/widget/dispatch.c
@@ -58,29 +58,91 @@
-static GtkWindow *main_window, *dialog_window, *text_window;
+static GtkWindow *main_window,
+ *dialog_window,
+ *text_window;
-/** phantom documentation used to test the functioning of doxygen */
-void *widget_get_main_window() { return main_window; }
-/** phantom documentation used to test the functioning of doxygen */
+
+/**
+ * @brief
+ * @details
+ * @date
+ * @author
+ * @callgraph
+ * @see
+ * @callergraph
+ * @see
+ * @param
+ * @return
+ */
+void *widget_get_main_window() { return main_window; }
+
+
+/**
+ * @brief
+ * @details
+ * @date
+ * @author
+ * @callgraph
+ * @see
+ * @callergraph
+ * @see
+ * @param
+ * @return
+ */
void *widget_get_dialog_window() { return dialog_window; }
-/** phantom documentation used to test the functioning of doxygen */
+
+
+/**
+ * @brief
+ * @details
+ * @date
+ * @author
+ * @callgraph
+ * @see
+ * @callergraph
+ * @see
+ * @param
+ * @return
+ */
void *widget_get_text_window() { return text_window; }
+
/*static void action_b (GSimpleAction *action,
GVariant *parameter,
GApplication *application) {printf ("action_b() in widget/dispatch\n");}action_b;*/
-/** phantom documentation used to test the functioning of doxygen */
-
+/**
+ * @brief
+ * @details
+ * @date
+ * @author
+ * @callgraph
+ * @see
+ * @callergraph
+ * @see
+ * @param
+ * @return
+ */
void on_windows_startup (GtkApplication *app) // WIP 2024-09
{
// NB on_windows_startup() is in: widget/dispatch NOT in: src/signal
fsm_journal_event (MESSAGE, WIDGETS, "widget/dispatch", "windows startup()", "(usage ?)");
}
-/** phantom documentation used to test the functioning of doxygen */
+/**
+ * @brief
+ * @details
+ * @date
+ * @author
+ * @callgraph
+ * @see
+ * @callergraph
+ * @see
+ * @param
+ * @return
+ */
void on_windows_activation (GtkApplication *app)
{
fsm_journal_event (INFO, WIDGETS, "widget/dispatch", "windows activation()", "has began");
diff --git a/wip/instanced_cubes compilation b/wip/instanced_cubes compilation
index f8af3fd..e5bc246 100644
--- a/wip/instanced_cubes compilation
+++ b/wip/instanced_cubes compilation
@@ -1,4 +1,4 @@
gcc `pkg-config --cflags --libs gtk4 epoxy glib-2.0` -lm -o instanced_cubes instanced_cubes.c
-./instanced_cubes
+./wip/instanced_cubes