texinfo-commits
[Top][All Lists]
Advanced

[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index]

branch master updated: * tp/Texinfo/Convert/LaTeX.pm (%ignorable_space_t


From: Patrice Dumas
Subject: branch master updated: * tp/Texinfo/Convert/LaTeX.pm (%ignorable_space_types): remove 'empty_spaces_before_paragraph'. (_convert): replace form feeds by \par{} in empty_spaces_after_close_brace only among ignored spaces.
Date: Fri, 26 Aug 2022 07:14:17 -0400

This is an automated email from the git hooks/post-receive script.

pertusus pushed a commit to branch master
in repository texinfo.

The following commit(s) were added to refs/heads/master by this push:
     new be9d58955f * tp/Texinfo/Convert/LaTeX.pm (%ignorable_space_types): 
remove 'empty_spaces_before_paragraph'. (_convert): replace form feeds by 
\par{} in empty_spaces_after_close_brace only among ignored spaces.
be9d58955f is described below

commit be9d58955f47231a4d88825405f7045a68898036
Author: Patrice Dumas <pertusus@free.fr>
AuthorDate: Fri Aug 26 13:14:00 2022 +0200

    * tp/Texinfo/Convert/LaTeX.pm (%ignorable_space_types): remove
    'empty_spaces_before_paragraph'.
    (_convert): replace form feeds by \par{} in empty_spaces_after_close_brace
    only among ignored spaces.
    
    * tp/Texinfo/Convert/HTML.pm (_convert_email_command): only space
    mail argument is considered empty.
    
    Add more tests.
---
 ChangeLog                                          |  10 +
 tp/TODO                                            |   2 +
 tp/Texinfo/Convert/HTML.pm                         |   3 +-
 tp/Texinfo/Convert/LaTeX.pm                        |  11 +-
 tp/t/03coverage_braces.t                           |  11 +-
 tp/t/converters_tests.t                            |  20 +
 tp/t/input_files/cpp_lines.texi                    |  44 +-
 tp/t/results/converters_tests/form_feeds.pl        | 803 ++++++++++++++++++++-
 .../results/coverage_braces/empty_line_in_email.pl | 152 ++++
 tp/t/results/include/cpp_lines.pl                  | 517 ++++++++++++-
 tp/tests/codeidx.idx                               |   0
 tp/tests/codeidx.ilg                               |   4 +
 tp/tests/codeidx.ind                               |   0
 tp/tests/cp.idx                                    | 155 ++++
 tp/tests/cp.ilg                                    |   6 +
 tp/tests/cp.ind                                    |  86 +++
 tp/tests/fn.idx                                    | 274 +++++++
 tp/tests/fn.ilg                                    |  11 +
 tp/tests/fn.ind                                    | 137 ++++
 tp/tests/formatting.aux                            |  42 ++
 tp/tests/formatting.out                            |   3 +
 tp/tests/formatting.pdf                            | Bin 0 -> 437921 bytes
 tp/tests/formatting.toc                            |   5 +
 .../formatting/res_parser/cpp_lines/cpp_lines.2    |   2 +
 .../formatting/res_parser/cpp_lines/cpp_lines.html |  29 +
 tp/tests/test_texixml_and_back.sh                  |  93 +++
 tp/tests/tp.idx                                    |   5 +
 tp/tests/tp.ilg                                    |   6 +
 tp/tests/tp.ind                                    |   6 +
 tp/tests/truc.idx                                  |   0
 tp/tests/truc.ilg                                  |   4 +
 tp/tests/truc.ind                                  |   0
 32 files changed, 2427 insertions(+), 14 deletions(-)

diff --git a/ChangeLog b/ChangeLog
index 029eb6bf46..290f971a8c 100644
--- a/ChangeLog
+++ b/ChangeLog
@@ -1,3 +1,13 @@
+2022-08-26  Patrice Dumas  <pertusus@free.fr>
+
+       * tp/Texinfo/Convert/LaTeX.pm (%ignorable_space_types): remove
+       'empty_spaces_before_paragraph'.
+       (_convert): replace form feeds by \par{} in 
empty_spaces_after_close_brace
+       only among ignored spaces.
+
+       * tp/Texinfo/Convert/HTML.pm (_convert_email_command): only space
+       mail argument is considered empty.
+
 2022-08-25  Gavin Smith  <gavinsmith0123@gmail.com>
 
        * NEWS: @set txicodevaristt.
diff --git a/tp/TODO b/tp/TODO
index 46d82eccff..4a85dbb023 100644
--- a/tp/TODO
+++ b/tp/TODO
@@ -13,6 +13,8 @@ Before next release
 Bugs
 ====
 
+form feeds results
+
 HTML API
 ========
 
diff --git a/tp/Texinfo/Convert/HTML.pm b/tp/Texinfo/Convert/HTML.pm
index acbf0d16b1..46ab38df38 100644
--- a/tp/Texinfo/Convert/HTML.pm
+++ b/tp/Texinfo/Convert/HTML.pm
@@ -2668,7 +2668,8 @@ sub _convert_email_command($$$$)
     $text = $text_arg->{'normal'};
   }
   $text = $mail_string unless ($text ne '');
-  return $text if ($mail eq '');
+  # match a non-space character, ascii and non-ascii spaces considered as 
spaces
+  return $text unless ($mail =~ /[^\v\h]/);
   if ($self->in_string()) {
     return "$mail_string ($text)";
   } else {
diff --git a/tp/Texinfo/Convert/LaTeX.pm b/tp/Texinfo/Convert/LaTeX.pm
index 5d6d3e198b..e8fca615eb 100644
--- a/tp/Texinfo/Convert/LaTeX.pm
+++ b/tp/Texinfo/Convert/LaTeX.pm
@@ -533,7 +533,7 @@ foreach my $environment_command 
(@LaTeX_same_block_commands) {
 my %ignorable_space_types;
 foreach my $type ('empty_line_after_command',
             'empty_spaces_after_command', 'spaces_at_end',
-            'empty_spaces_before_argument', 'empty_spaces_before_paragraph',
+            'empty_spaces_before_argument',
             'empty_spaces_after_close_brace') {
   $ignorable_space_types{$type} = 1;
 }
@@ -2222,10 +2222,11 @@ sub _convert($$)
   }
 
   # in ignorable spaces, keep only form feeds.
-  if ($type and $self->{'ignorable_space_types'}->{$type}
-      and ($type ne 'empty_spaces_before_paragraph')) {
-    if ($element->{'text'} =~ /\f/) {
-      $result = '\par{}';
+  if ($type and $self->{'ignorable_space_types'}->{$type}) {
+    if ($type eq 'empty_spaces_after_close_brace') {
+      if ($element->{'text'} =~ /\f/) {
+        $result = '\par{}';
+      }
     }
     return $result;
   }
diff --git a/tp/t/03coverage_braces.t b/tp/t/03coverage_braces.t
index 3b21ac0e47..dd3a5e08e8 100644
--- a/tp/t/03coverage_braces.t
+++ b/tp/t/03coverage_braces.t
@@ -246,6 +246,15 @@ $two_footnotes_in_nodes_text,
 '@footnotestyle separate
 '.$two_footnotes_in_nodes_text,
 , {'test_formats' => ['html', 'info'], 'full_document' => 1} ],
+# could be in @test_invalid too, but also allows to test what happens
+# to formatting with empty first email first argument
+['empty_line_in_email',
+'@email{ 
+
+mail,
+
+text
+}'],
 ['form_feed_in_brace_commands',
 '@option{ aa} @anchor{aa}something @email{aaa,  fff}@footnote{ 
  f1 } @footnote{  ggjj}.
@@ -341,7 +350,7 @@ third}
 );
 
 my @latex_tests_cases_tests = ('abbr_acronym', 'uref_url',
-  'uref_with_commands_characters', 'nested', 'uref_in_ref');
+  'uref_with_commands_characters', 'nested', 'uref_in_ref', 
'empty_line_in_email');
 
 foreach my $test (@test_cases) {
   push @{$test->[2]->{'test_formats'}}, 'plaintext';
diff --git a/tp/t/converters_tests.t b/tp/t/converters_tests.t
index 4176ced724..1ae1d91410 100644
--- a/tp/t/converters_tests.t
+++ b/tp/t/converters_tests.t
@@ -143,6 +143,7 @@ my @test_cases = (
 ['empty_accent',
 '@`{}
 '],
+# FIXME remove duplication from t/03coverage_braces.t 
form_feed_in_brace_commands
 ['form_feeds',
 '@node Top
 
@@ -161,6 +162,25 @@ cc \f dd".'
 @code{middle'."\f".' in code}
 
 @xref{first'."\f".'node}
+
+@example '."\f".'
+in example
+@end example
+
+@center '."\f".' around center '."\f".'
+@center in '."\f".'center
+
+@indicateurl{ '."\f".' in indicateurl}
+
+@deffn { '."\f".'truc } { machin }  { bidule }  { '."\f".' chose '."\f".'} {  
arg'."\f".' }
+T
+@end deffn
+
+@float
+a float
+@caption{'."\f".' in cation '."\f".'} '."\f".' Toto
+@end float '."\f".'
+
 '],
 ['some_at_commands_in_ref_nodes',
 '
diff --git a/tp/t/input_files/cpp_lines.texi b/tp/t/input_files/cpp_lines.texi
index 06dbde59f4..a9b7dda98e 100644
--- a/tp/t/input_files/cpp_lines.texi
+++ b/tp/t/input_files/cpp_lines.texi
@@ -47,7 +47,49 @@ line before
 
 @email{after verb}
 
-# line 5 "accentêd"
+a@footnote{
+#line 25 "footnote"
+in footnote}
+
+a@footnote{
+#line 35 "footnote2"
+
+in 2footnote}
+
+
+@email{ 
+#line 50 "email1"
+etext1,
+#line 60 "email2"
+etext2
+}
+
+@email{
+ no line directive mail space,
+ no line directive text space
+}
+
+@email{ 
+#line 50 "email11"
+ mail space,
+#line 60 "email12"
+ text space
+}
+
+@email{ 
+#line 80 "email3"
+
+etext3,
+
+#line 60 "email4"
+
+etext4
+}
+
+
+#line 70 "email3"
+
+#line 5 "accentêd"
 
 @documentlanguage làng
 
diff --git a/tp/t/results/converters_tests/form_feeds.pl 
b/tp/t/results/converters_tests/form_feeds.pl
index a228571c4d..28c8eba64e 100644
--- a/tp/t/results/converters_tests/form_feeds.pl
+++ b/tp/t/results/converters_tests/form_feeds.pl
@@ -324,6 +324,563 @@ $result_trees{'form_feeds'} = {
           ],
           'parent' => {},
           'type' => 'paragraph'
+        },
+        {
+          'parent' => {},
+          'text' => '
+',
+          'type' => 'empty_line'
+        },
+        {
+          'cmdname' => 'example',
+          'contents' => [
+            {
+              'extra' => {
+                'command' => {}
+              },
+              'parent' => {},
+              'text' => ' 
+',
+              'type' => 'empty_line_after_command'
+            },
+            {
+              'contents' => [
+                {
+                  'parent' => {},
+                  'text' => 'in example
+'
+                }
+              ],
+              'parent' => {},
+              'type' => 'preformatted'
+            },
+            {
+              'args' => [
+                {
+                  'contents' => [
+                    {
+                      'parent' => {},
+                      'text' => 'example'
+                    }
+                  ],
+                  'extra' => {
+                    'spaces_after_argument' => '
+'
+                  },
+                  'parent' => {},
+                  'type' => 'line_arg'
+                }
+              ],
+              'cmdname' => 'end',
+              'extra' => {
+                'command_argument' => 'example',
+                'spaces_before_argument' => ' ',
+                'text_arg' => 'example'
+              },
+              'parent' => {},
+              'source_info' => {
+                'file_name' => '',
+                'line_nr' => 21,
+                'macro' => ''
+              }
+            }
+          ],
+          'extra' => {
+            'end_command' => {}
+          },
+          'parent' => {},
+          'source_info' => {
+            'file_name' => '',
+            'line_nr' => 19,
+            'macro' => ''
+          }
+        },
+        {
+          'parent' => {},
+          'text' => '
+',
+          'type' => 'empty_line'
+        },
+        {
+          'args' => [
+            {
+              'contents' => [
+                {
+                  'parent' => {},
+                  'text' => 'around center'
+                }
+              ],
+              'extra' => {
+                'spaces_after_argument' => ' 
+'
+              },
+              'parent' => {},
+              'type' => 'line_arg'
+            }
+          ],
+          'cmdname' => 'center',
+          'extra' => {
+            'spaces_before_argument' => '  '
+          },
+          'parent' => {},
+          'source_info' => {
+            'file_name' => '',
+            'line_nr' => 23,
+            'macro' => ''
+          }
+        },
+        {
+          'args' => [
+            {
+              'contents' => [
+                {
+                  'parent' => {},
+                  'text' => 'in center'
+                }
+              ],
+              'extra' => {
+                'spaces_after_argument' => '
+'
+              },
+              'parent' => {},
+              'type' => 'line_arg'
+            }
+          ],
+          'cmdname' => 'center',
+          'extra' => {
+            'spaces_before_argument' => ' '
+          },
+          'parent' => {},
+          'source_info' => {
+            'file_name' => '',
+            'line_nr' => 24,
+            'macro' => ''
+          }
+        },
+        {
+          'parent' => {},
+          'text' => '
+',
+          'type' => 'empty_line'
+        },
+        {
+          'contents' => [
+            {
+              'args' => [
+                {
+                  'contents' => [
+                    {
+                      'parent' => {},
+                      'text' => 'in indicateurl'
+                    }
+                  ],
+                  'extra' => {
+                    'spaces_before_argument' => '  '
+                  },
+                  'parent' => {},
+                  'type' => 'brace_command_arg'
+                }
+              ],
+              'cmdname' => 'indicateurl',
+              'contents' => [],
+              'parent' => {},
+              'source_info' => {
+                'file_name' => '',
+                'line_nr' => 26,
+                'macro' => ''
+              }
+            },
+            {
+              'parent' => {},
+              'text' => '
+'
+            }
+          ],
+          'parent' => {},
+          'type' => 'paragraph'
+        },
+        {
+          'parent' => {},
+          'text' => '
+',
+          'type' => 'empty_line'
+        },
+        {
+          'cmdname' => 'deffn',
+          'contents' => [
+            {
+              'args' => [
+                {
+                  'contents' => [
+                    {
+                      'contents' => [
+                        {
+                          'parent' => {},
+                          'text' => 'truc'
+                        }
+                      ],
+                      'extra' => {
+                        'def_role' => 'category',
+                        'spaces_after_argument' => ' ',
+                        'spaces_before_argument' => ' '
+                      },
+                      'parent' => {},
+                      'source_info' => {
+                        'file_name' => '',
+                        'line_nr' => 28,
+                        'macro' => ''
+                      },
+                      'type' => 'bracketed_def_content'
+                    },
+                    {
+                      'extra' => {
+                        'def_role' => 'spaces'
+                      },
+                      'parent' => {},
+                      'text' => ' ',
+                      'type' => 'spaces'
+                    },
+                    {
+                      'contents' => [
+                        {
+                          'parent' => {},
+                          'text' => 'machin'
+                        }
+                      ],
+                      'extra' => {
+                        'def_role' => 'name',
+                        'spaces_after_argument' => ' ',
+                        'spaces_before_argument' => ' '
+                      },
+                      'parent' => {},
+                      'source_info' => {
+                        'file_name' => '',
+                        'line_nr' => 28,
+                        'macro' => ''
+                      },
+                      'type' => 'bracketed_def_content'
+                    },
+                    {
+                      'extra' => {
+                        'def_role' => 'spaces'
+                      },
+                      'parent' => {},
+                      'text' => '  ',
+                      'type' => 'spaces'
+                    },
+                    {
+                      'contents' => [
+                        {
+                          'parent' => {},
+                          'text' => 'bidule'
+                        }
+                      ],
+                      'extra' => {
+                        'def_role' => 'arg',
+                        'spaces_after_argument' => ' ',
+                        'spaces_before_argument' => ' '
+                      },
+                      'parent' => {},
+                      'source_info' => {
+                        'file_name' => '',
+                        'line_nr' => 28,
+                        'macro' => ''
+                      },
+                      'type' => 'bracketed_def_content'
+                    },
+                    {
+                      'extra' => {
+                        'def_role' => 'spaces'
+                      },
+                      'parent' => {},
+                      'text' => '  ',
+                      'type' => 'spaces'
+                    },
+                    {
+                      'contents' => [
+                        {
+                          'parent' => {},
+                          'text' => 'chose'
+                        }
+                      ],
+                      'extra' => {
+                        'def_role' => 'arg',
+                        'spaces_after_argument' => ' ',
+                        'spaces_before_argument' => '  '
+                      },
+                      'parent' => {},
+                      'source_info' => {
+                        'file_name' => '',
+                        'line_nr' => 28,
+                        'macro' => ''
+                      },
+                      'type' => 'bracketed_def_content'
+                    },
+                    {
+                      'extra' => {
+                        'def_role' => 'spaces'
+                      },
+                      'parent' => {},
+                      'text' => ' ',
+                      'type' => 'spaces'
+                    },
+                    {
+                      'contents' => [
+                        {
+                          'parent' => {},
+                          'text' => 'arg'
+                        }
+                      ],
+                      'extra' => {
+                        'def_role' => 'arg',
+                        'spaces_after_argument' => ' ',
+                        'spaces_before_argument' => '  '
+                      },
+                      'parent' => {},
+                      'source_info' => {
+                        'file_name' => '',
+                        'line_nr' => 28,
+                        'macro' => ''
+                      },
+                      'type' => 'bracketed_def_content'
+                    },
+                    {
+                      'extra' => {
+                        'def_role' => 'spaces'
+                      },
+                      'parent' => {},
+                      'text' => '
+',
+                      'type' => 'spaces_at_end'
+                    }
+                  ],
+                  'parent' => {},
+                  'type' => 'block_line_arg'
+                }
+              ],
+              'extra' => {
+                'def_command' => 'deffn',
+                'def_parsed_hash' => {
+                  'category' => {},
+                  'name' => {}
+                },
+                'index_entry' => {
+                  'command' => {},
+                  'content' => [
+                    {}
+                  ],
+                  'content_normalized' => [
+                    {}
+                  ],
+                  'in_code' => 1,
+                  'index_at_command' => 'deffn',
+                  'index_ignore_chars' => {},
+                  'index_name' => 'fn',
+                  'index_type_command' => 'deffn',
+                  'node' => {},
+                  'number' => 1
+                },
+                'original_def_cmdname' => 'deffn'
+              },
+              'parent' => {},
+              'source_info' => {
+                'file_name' => '',
+                'line_nr' => 28,
+                'macro' => ''
+              },
+              'type' => 'def_line'
+            },
+            {
+              'contents' => [
+                {
+                  'contents' => [
+                    {
+                      'parent' => {},
+                      'text' => 'T
+'
+                    }
+                  ],
+                  'parent' => {},
+                  'type' => 'paragraph'
+                }
+              ],
+              'parent' => {},
+              'type' => 'def_item'
+            },
+            {
+              'args' => [
+                {
+                  'contents' => [
+                    {
+                      'parent' => {},
+                      'text' => 'deffn'
+                    }
+                  ],
+                  'extra' => {
+                    'spaces_after_argument' => '
+'
+                  },
+                  'parent' => {},
+                  'type' => 'line_arg'
+                }
+              ],
+              'cmdname' => 'end',
+              'extra' => {
+                'command_argument' => 'deffn',
+                'spaces_before_argument' => ' ',
+                'text_arg' => 'deffn'
+              },
+              'parent' => {},
+              'source_info' => {
+                'file_name' => '',
+                'line_nr' => 30,
+                'macro' => ''
+              }
+            }
+          ],
+          'extra' => {
+            'end_command' => {},
+            'spaces_before_argument' => ' '
+          },
+          'parent' => {},
+          'source_info' => {
+            'file_name' => '',
+            'line_nr' => 28,
+            'macro' => ''
+          }
+        },
+        {
+          'parent' => {},
+          'text' => '
+',
+          'type' => 'empty_line'
+        },
+        {
+          'cmdname' => 'float',
+          'contents' => [
+            {
+              'extra' => {
+                'command' => {}
+              },
+              'parent' => {},
+              'text' => '
+',
+              'type' => 'empty_line_after_command'
+            },
+            {
+              'contents' => [
+                {
+                  'parent' => {},
+                  'text' => 'a float
+'
+                }
+              ],
+              'parent' => {},
+              'type' => 'paragraph'
+            },
+            {
+              'args' => [
+                {
+                  'contents' => [
+                    {
+                      'contents' => [
+                        {
+                          'parent' => {},
+                          'text' => 'in cation '
+                        }
+                      ],
+                      'parent' => {},
+                      'type' => 'paragraph'
+                    },
+                    {
+                      'parent' => {},
+                      'text' => '',
+                      'type' => 'empty_line'
+                    }
+                  ],
+                  'parent' => {},
+                  'type' => 'brace_command_context'
+                }
+              ],
+              'cmdname' => 'caption',
+              'contents' => [],
+              'extra' => {
+                'float' => {},
+                'spaces_before_argument' => ' '
+              },
+              'parent' => {},
+              'source_info' => {
+                'file_name' => '',
+                'line_nr' => 34,
+                'macro' => ''
+              }
+            },
+            {
+              'parent' => {},
+              'text' => '  ',
+              'type' => 'empty_spaces_after_close_brace'
+            },
+            {
+              'contents' => [
+                {
+                  'parent' => {},
+                  'text' => 'Toto
+'
+                }
+              ],
+              'parent' => {},
+              'type' => 'paragraph'
+            },
+            {
+              'args' => [
+                {
+                  'contents' => [
+                    {
+                      'parent' => {},
+                      'text' => 'float'
+                    }
+                  ],
+                  'extra' => {
+                    'spaces_after_argument' => ' 
+'
+                  },
+                  'parent' => {},
+                  'type' => 'line_arg'
+                }
+              ],
+              'cmdname' => 'end',
+              'extra' => {
+                'command_argument' => 'float',
+                'spaces_before_argument' => ' ',
+                'text_arg' => 'float'
+              },
+              'parent' => {},
+              'source_info' => {
+                'file_name' => '',
+                'line_nr' => 35,
+                'macro' => ''
+              }
+            }
+          ],
+          'extra' => {
+            'caption' => {},
+            'end_command' => {},
+            'type' => {
+              'normalized' => ''
+            }
+          },
+          'parent' => {},
+          'source_info' => {
+            'file_name' => '',
+            'line_nr' => 32,
+            'macro' => ''
+          }
+        },
+        {
+          'parent' => {},
+          'text' => '
+',
+          'type' => 'empty_line'
         }
       ],
       'extra' => {
@@ -401,6 +958,82 @@ 
$result_trees{'form_feeds'}{'contents'}[2]{'contents'}[18]{'contents'}[0]{'extra
 
$result_trees{'form_feeds'}{'contents'}[2]{'contents'}[18]{'contents'}[0]{'parent'}
 = $result_trees{'form_feeds'}{'contents'}[2]{'contents'}[18];
 
$result_trees{'form_feeds'}{'contents'}[2]{'contents'}[18]{'contents'}[1]{'parent'}
 = $result_trees{'form_feeds'}{'contents'}[2]{'contents'}[18];
 $result_trees{'form_feeds'}{'contents'}[2]{'contents'}[18]{'parent'} = 
$result_trees{'form_feeds'}{'contents'}[2];
+$result_trees{'form_feeds'}{'contents'}[2]{'contents'}[19]{'parent'} = 
$result_trees{'form_feeds'}{'contents'}[2];
+$result_trees{'form_feeds'}{'contents'}[2]{'contents'}[20]{'contents'}[0]{'extra'}{'command'}
 = $result_trees{'form_feeds'}{'contents'}[2]{'contents'}[20];
+$result_trees{'form_feeds'}{'contents'}[2]{'contents'}[20]{'contents'}[0]{'parent'}
 = $result_trees{'form_feeds'}{'contents'}[2]{'contents'}[20];
+$result_trees{'form_feeds'}{'contents'}[2]{'contents'}[20]{'contents'}[1]{'contents'}[0]{'parent'}
 = $result_trees{'form_feeds'}{'contents'}[2]{'contents'}[20]{'contents'}[1];
+$result_trees{'form_feeds'}{'contents'}[2]{'contents'}[20]{'contents'}[1]{'parent'}
 = $result_trees{'form_feeds'}{'contents'}[2]{'contents'}[20];
+$result_trees{'form_feeds'}{'contents'}[2]{'contents'}[20]{'contents'}[2]{'args'}[0]{'contents'}[0]{'parent'}
 = 
$result_trees{'form_feeds'}{'contents'}[2]{'contents'}[20]{'contents'}[2]{'args'}[0];
+$result_trees{'form_feeds'}{'contents'}[2]{'contents'}[20]{'contents'}[2]{'args'}[0]{'parent'}
 = $result_trees{'form_feeds'}{'contents'}[2]{'contents'}[20]{'contents'}[2];
+$result_trees{'form_feeds'}{'contents'}[2]{'contents'}[20]{'contents'}[2]{'parent'}
 = $result_trees{'form_feeds'}{'contents'}[2]{'contents'}[20];
+$result_trees{'form_feeds'}{'contents'}[2]{'contents'}[20]{'extra'}{'end_command'}
 = $result_trees{'form_feeds'}{'contents'}[2]{'contents'}[20]{'contents'}[2];
+$result_trees{'form_feeds'}{'contents'}[2]{'contents'}[20]{'parent'} = 
$result_trees{'form_feeds'}{'contents'}[2];
+$result_trees{'form_feeds'}{'contents'}[2]{'contents'}[21]{'parent'} = 
$result_trees{'form_feeds'}{'contents'}[2];
+$result_trees{'form_feeds'}{'contents'}[2]{'contents'}[22]{'args'}[0]{'contents'}[0]{'parent'}
 = $result_trees{'form_feeds'}{'contents'}[2]{'contents'}[22]{'args'}[0];
+$result_trees{'form_feeds'}{'contents'}[2]{'contents'}[22]{'args'}[0]{'parent'}
 = $result_trees{'form_feeds'}{'contents'}[2]{'contents'}[22];
+$result_trees{'form_feeds'}{'contents'}[2]{'contents'}[22]{'parent'} = 
$result_trees{'form_feeds'}{'contents'}[2];
+$result_trees{'form_feeds'}{'contents'}[2]{'contents'}[23]{'args'}[0]{'contents'}[0]{'parent'}
 = $result_trees{'form_feeds'}{'contents'}[2]{'contents'}[23]{'args'}[0];
+$result_trees{'form_feeds'}{'contents'}[2]{'contents'}[23]{'args'}[0]{'parent'}
 = $result_trees{'form_feeds'}{'contents'}[2]{'contents'}[23];
+$result_trees{'form_feeds'}{'contents'}[2]{'contents'}[23]{'parent'} = 
$result_trees{'form_feeds'}{'contents'}[2];
+$result_trees{'form_feeds'}{'contents'}[2]{'contents'}[24]{'parent'} = 
$result_trees{'form_feeds'}{'contents'}[2];
+$result_trees{'form_feeds'}{'contents'}[2]{'contents'}[25]{'contents'}[0]{'args'}[0]{'contents'}[0]{'parent'}
 = 
$result_trees{'form_feeds'}{'contents'}[2]{'contents'}[25]{'contents'}[0]{'args'}[0];
+$result_trees{'form_feeds'}{'contents'}[2]{'contents'}[25]{'contents'}[0]{'args'}[0]{'parent'}
 = $result_trees{'form_feeds'}{'contents'}[2]{'contents'}[25]{'contents'}[0];
+$result_trees{'form_feeds'}{'contents'}[2]{'contents'}[25]{'contents'}[0]{'parent'}
 = $result_trees{'form_feeds'}{'contents'}[2]{'contents'}[25];
+$result_trees{'form_feeds'}{'contents'}[2]{'contents'}[25]{'contents'}[1]{'parent'}
 = $result_trees{'form_feeds'}{'contents'}[2]{'contents'}[25];
+$result_trees{'form_feeds'}{'contents'}[2]{'contents'}[25]{'parent'} = 
$result_trees{'form_feeds'}{'contents'}[2];
+$result_trees{'form_feeds'}{'contents'}[2]{'contents'}[26]{'parent'} = 
$result_trees{'form_feeds'}{'contents'}[2];
+$result_trees{'form_feeds'}{'contents'}[2]{'contents'}[27]{'contents'}[0]{'args'}[0]{'contents'}[0]{'contents'}[0]{'parent'}
 = 
$result_trees{'form_feeds'}{'contents'}[2]{'contents'}[27]{'contents'}[0]{'args'}[0]{'contents'}[0];
+$result_trees{'form_feeds'}{'contents'}[2]{'contents'}[27]{'contents'}[0]{'args'}[0]{'contents'}[0]{'parent'}
 = 
$result_trees{'form_feeds'}{'contents'}[2]{'contents'}[27]{'contents'}[0]{'args'}[0];
+$result_trees{'form_feeds'}{'contents'}[2]{'contents'}[27]{'contents'}[0]{'args'}[0]{'contents'}[1]{'parent'}
 = 
$result_trees{'form_feeds'}{'contents'}[2]{'contents'}[27]{'contents'}[0]{'args'}[0];
+$result_trees{'form_feeds'}{'contents'}[2]{'contents'}[27]{'contents'}[0]{'args'}[0]{'contents'}[2]{'contents'}[0]{'parent'}
 = 
$result_trees{'form_feeds'}{'contents'}[2]{'contents'}[27]{'contents'}[0]{'args'}[0]{'contents'}[2];
+$result_trees{'form_feeds'}{'contents'}[2]{'contents'}[27]{'contents'}[0]{'args'}[0]{'contents'}[2]{'parent'}
 = 
$result_trees{'form_feeds'}{'contents'}[2]{'contents'}[27]{'contents'}[0]{'args'}[0];
+$result_trees{'form_feeds'}{'contents'}[2]{'contents'}[27]{'contents'}[0]{'args'}[0]{'contents'}[3]{'parent'}
 = 
$result_trees{'form_feeds'}{'contents'}[2]{'contents'}[27]{'contents'}[0]{'args'}[0];
+$result_trees{'form_feeds'}{'contents'}[2]{'contents'}[27]{'contents'}[0]{'args'}[0]{'contents'}[4]{'contents'}[0]{'parent'}
 = 
$result_trees{'form_feeds'}{'contents'}[2]{'contents'}[27]{'contents'}[0]{'args'}[0]{'contents'}[4];
+$result_trees{'form_feeds'}{'contents'}[2]{'contents'}[27]{'contents'}[0]{'args'}[0]{'contents'}[4]{'parent'}
 = 
$result_trees{'form_feeds'}{'contents'}[2]{'contents'}[27]{'contents'}[0]{'args'}[0];
+$result_trees{'form_feeds'}{'contents'}[2]{'contents'}[27]{'contents'}[0]{'args'}[0]{'contents'}[5]{'parent'}
 = 
$result_trees{'form_feeds'}{'contents'}[2]{'contents'}[27]{'contents'}[0]{'args'}[0];
+$result_trees{'form_feeds'}{'contents'}[2]{'contents'}[27]{'contents'}[0]{'args'}[0]{'contents'}[6]{'contents'}[0]{'parent'}
 = 
$result_trees{'form_feeds'}{'contents'}[2]{'contents'}[27]{'contents'}[0]{'args'}[0]{'contents'}[6];
+$result_trees{'form_feeds'}{'contents'}[2]{'contents'}[27]{'contents'}[0]{'args'}[0]{'contents'}[6]{'parent'}
 = 
$result_trees{'form_feeds'}{'contents'}[2]{'contents'}[27]{'contents'}[0]{'args'}[0];
+$result_trees{'form_feeds'}{'contents'}[2]{'contents'}[27]{'contents'}[0]{'args'}[0]{'contents'}[7]{'parent'}
 = 
$result_trees{'form_feeds'}{'contents'}[2]{'contents'}[27]{'contents'}[0]{'args'}[0];
+$result_trees{'form_feeds'}{'contents'}[2]{'contents'}[27]{'contents'}[0]{'args'}[0]{'contents'}[8]{'contents'}[0]{'parent'}
 = 
$result_trees{'form_feeds'}{'contents'}[2]{'contents'}[27]{'contents'}[0]{'args'}[0]{'contents'}[8];
+$result_trees{'form_feeds'}{'contents'}[2]{'contents'}[27]{'contents'}[0]{'args'}[0]{'contents'}[8]{'parent'}
 = 
$result_trees{'form_feeds'}{'contents'}[2]{'contents'}[27]{'contents'}[0]{'args'}[0];
+$result_trees{'form_feeds'}{'contents'}[2]{'contents'}[27]{'contents'}[0]{'args'}[0]{'contents'}[9]{'parent'}
 = 
$result_trees{'form_feeds'}{'contents'}[2]{'contents'}[27]{'contents'}[0]{'args'}[0];
+$result_trees{'form_feeds'}{'contents'}[2]{'contents'}[27]{'contents'}[0]{'args'}[0]{'parent'}
 = $result_trees{'form_feeds'}{'contents'}[2]{'contents'}[27]{'contents'}[0];
+$result_trees{'form_feeds'}{'contents'}[2]{'contents'}[27]{'contents'}[0]{'extra'}{'def_parsed_hash'}{'category'}
 = 
$result_trees{'form_feeds'}{'contents'}[2]{'contents'}[27]{'contents'}[0]{'args'}[0]{'contents'}[0];
+$result_trees{'form_feeds'}{'contents'}[2]{'contents'}[27]{'contents'}[0]{'extra'}{'def_parsed_hash'}{'name'}
 = 
$result_trees{'form_feeds'}{'contents'}[2]{'contents'}[27]{'contents'}[0]{'args'}[0]{'contents'}[2];
+$result_trees{'form_feeds'}{'contents'}[2]{'contents'}[27]{'contents'}[0]{'extra'}{'index_entry'}{'command'}
 = $result_trees{'form_feeds'}{'contents'}[2]{'contents'}[27]{'contents'}[0];
+$result_trees{'form_feeds'}{'contents'}[2]{'contents'}[27]{'contents'}[0]{'extra'}{'index_entry'}{'content'}[0]
 = 
$result_trees{'form_feeds'}{'contents'}[2]{'contents'}[27]{'contents'}[0]{'args'}[0]{'contents'}[2];
+$result_trees{'form_feeds'}{'contents'}[2]{'contents'}[27]{'contents'}[0]{'extra'}{'index_entry'}{'content_normalized'}[0]
 = 
$result_trees{'form_feeds'}{'contents'}[2]{'contents'}[27]{'contents'}[0]{'args'}[0]{'contents'}[2];
+$result_trees{'form_feeds'}{'contents'}[2]{'contents'}[27]{'contents'}[0]{'extra'}{'index_entry'}{'node'}
 = $result_trees{'form_feeds'}{'contents'}[2];
+$result_trees{'form_feeds'}{'contents'}[2]{'contents'}[27]{'contents'}[0]{'parent'}
 = $result_trees{'form_feeds'}{'contents'}[2]{'contents'}[27];
+$result_trees{'form_feeds'}{'contents'}[2]{'contents'}[27]{'contents'}[1]{'contents'}[0]{'contents'}[0]{'parent'}
 = 
$result_trees{'form_feeds'}{'contents'}[2]{'contents'}[27]{'contents'}[1]{'contents'}[0];
+$result_trees{'form_feeds'}{'contents'}[2]{'contents'}[27]{'contents'}[1]{'contents'}[0]{'parent'}
 = $result_trees{'form_feeds'}{'contents'}[2]{'contents'}[27]{'contents'}[1];
+$result_trees{'form_feeds'}{'contents'}[2]{'contents'}[27]{'contents'}[1]{'parent'}
 = $result_trees{'form_feeds'}{'contents'}[2]{'contents'}[27];
+$result_trees{'form_feeds'}{'contents'}[2]{'contents'}[27]{'contents'}[2]{'args'}[0]{'contents'}[0]{'parent'}
 = 
$result_trees{'form_feeds'}{'contents'}[2]{'contents'}[27]{'contents'}[2]{'args'}[0];
+$result_trees{'form_feeds'}{'contents'}[2]{'contents'}[27]{'contents'}[2]{'args'}[0]{'parent'}
 = $result_trees{'form_feeds'}{'contents'}[2]{'contents'}[27]{'contents'}[2];
+$result_trees{'form_feeds'}{'contents'}[2]{'contents'}[27]{'contents'}[2]{'parent'}
 = $result_trees{'form_feeds'}{'contents'}[2]{'contents'}[27];
+$result_trees{'form_feeds'}{'contents'}[2]{'contents'}[27]{'extra'}{'end_command'}
 = $result_trees{'form_feeds'}{'contents'}[2]{'contents'}[27]{'contents'}[2];
+$result_trees{'form_feeds'}{'contents'}[2]{'contents'}[27]{'parent'} = 
$result_trees{'form_feeds'}{'contents'}[2];
+$result_trees{'form_feeds'}{'contents'}[2]{'contents'}[28]{'parent'} = 
$result_trees{'form_feeds'}{'contents'}[2];
+$result_trees{'form_feeds'}{'contents'}[2]{'contents'}[29]{'contents'}[0]{'extra'}{'command'}
 = $result_trees{'form_feeds'}{'contents'}[2]{'contents'}[29];
+$result_trees{'form_feeds'}{'contents'}[2]{'contents'}[29]{'contents'}[0]{'parent'}
 = $result_trees{'form_feeds'}{'contents'}[2]{'contents'}[29];
+$result_trees{'form_feeds'}{'contents'}[2]{'contents'}[29]{'contents'}[1]{'contents'}[0]{'parent'}
 = $result_trees{'form_feeds'}{'contents'}[2]{'contents'}[29]{'contents'}[1];
+$result_trees{'form_feeds'}{'contents'}[2]{'contents'}[29]{'contents'}[1]{'parent'}
 = $result_trees{'form_feeds'}{'contents'}[2]{'contents'}[29];
+$result_trees{'form_feeds'}{'contents'}[2]{'contents'}[29]{'contents'}[2]{'args'}[0]{'contents'}[0]{'contents'}[0]{'parent'}
 = 
$result_trees{'form_feeds'}{'contents'}[2]{'contents'}[29]{'contents'}[2]{'args'}[0]{'contents'}[0];
+$result_trees{'form_feeds'}{'contents'}[2]{'contents'}[29]{'contents'}[2]{'args'}[0]{'contents'}[0]{'parent'}
 = 
$result_trees{'form_feeds'}{'contents'}[2]{'contents'}[29]{'contents'}[2]{'args'}[0];
+$result_trees{'form_feeds'}{'contents'}[2]{'contents'}[29]{'contents'}[2]{'args'}[0]{'contents'}[1]{'parent'}
 = 
$result_trees{'form_feeds'}{'contents'}[2]{'contents'}[29]{'contents'}[2]{'args'}[0];
+$result_trees{'form_feeds'}{'contents'}[2]{'contents'}[29]{'contents'}[2]{'args'}[0]{'parent'}
 = $result_trees{'form_feeds'}{'contents'}[2]{'contents'}[29]{'contents'}[2];
+$result_trees{'form_feeds'}{'contents'}[2]{'contents'}[29]{'contents'}[2]{'extra'}{'float'}
 = $result_trees{'form_feeds'}{'contents'}[2]{'contents'}[29];
+$result_trees{'form_feeds'}{'contents'}[2]{'contents'}[29]{'contents'}[2]{'parent'}
 = $result_trees{'form_feeds'}{'contents'}[2]{'contents'}[29];
+$result_trees{'form_feeds'}{'contents'}[2]{'contents'}[29]{'contents'}[3]{'parent'}
 = $result_trees{'form_feeds'}{'contents'}[2]{'contents'}[29];
+$result_trees{'form_feeds'}{'contents'}[2]{'contents'}[29]{'contents'}[4]{'contents'}[0]{'parent'}
 = $result_trees{'form_feeds'}{'contents'}[2]{'contents'}[29]{'contents'}[4];
+$result_trees{'form_feeds'}{'contents'}[2]{'contents'}[29]{'contents'}[4]{'parent'}
 = $result_trees{'form_feeds'}{'contents'}[2]{'contents'}[29];
+$result_trees{'form_feeds'}{'contents'}[2]{'contents'}[29]{'contents'}[5]{'args'}[0]{'contents'}[0]{'parent'}
 = 
$result_trees{'form_feeds'}{'contents'}[2]{'contents'}[29]{'contents'}[5]{'args'}[0];
+$result_trees{'form_feeds'}{'contents'}[2]{'contents'}[29]{'contents'}[5]{'args'}[0]{'parent'}
 = $result_trees{'form_feeds'}{'contents'}[2]{'contents'}[29]{'contents'}[5];
+$result_trees{'form_feeds'}{'contents'}[2]{'contents'}[29]{'contents'}[5]{'parent'}
 = $result_trees{'form_feeds'}{'contents'}[2]{'contents'}[29];
+$result_trees{'form_feeds'}{'contents'}[2]{'contents'}[29]{'extra'}{'caption'} 
= $result_trees{'form_feeds'}{'contents'}[2]{'contents'}[29]{'contents'}[2];
+$result_trees{'form_feeds'}{'contents'}[2]{'contents'}[29]{'extra'}{'end_command'}
 = $result_trees{'form_feeds'}{'contents'}[2]{'contents'}[29]{'contents'}[5];
+$result_trees{'form_feeds'}{'contents'}[2]{'contents'}[29]{'parent'} = 
$result_trees{'form_feeds'}{'contents'}[2];
+$result_trees{'form_feeds'}{'contents'}[2]{'contents'}[30]{'parent'} = 
$result_trees{'form_feeds'}{'contents'}[2];
 $result_trees{'form_feeds'}{'contents'}[2]{'extra'}{'node_content'}[0] = 
$result_trees{'form_feeds'}{'contents'}[2]{'args'}[0]{'contents'}[0];
 
$result_trees{'form_feeds'}{'contents'}[2]{'extra'}{'nodes_manuals'}[0]{'node_content'}[0]
 = $result_trees{'form_feeds'}{'contents'}[2]{'args'}[0]{'contents'}[0];
 $result_trees{'form_feeds'}{'contents'}[2]{'parent'} = 
$result_trees{'form_feeds'};
@@ -422,6 +1055,25 @@ cc  dd
 @code{middle in code}
 
 @xref{firstnode}
+
+@example 
+in example
+@end example
+
+@center  around center 
+@center in center
+
+@indicateurl{  in indicateurl}
+
+@deffn { truc } { machin }  { bidule }  {  chose } {  arg }
+T
+@end deffn
+
+@float
+a float
+@caption{ in cation }  Toto
+@end float 
+
 ';
 
 
@@ -440,6 +1092,20 @@ end in code
 middle in code
 
 firstnode
+
+in example
+
+around center
+in center
+
+in indicateurl
+
+truc: machin bidule  chose arg
+T
+
+a float
+Toto
+
 ';
 
 $result_nodes{'form_feeds'} = {
@@ -472,7 +1138,33 @@ $result_menus{'form_feeds'} = {
 $result_errors{'form_feeds'} = [];
 
 
-$result_floats{'form_feeds'} = {};
+$result_floats{'form_feeds'} = {
+  '' => [
+    {
+      'cmdname' => 'float',
+      'extra' => {
+        'caption' => {
+          'cmdname' => 'caption',
+          'extra' => {
+            'float' => {}
+          }
+        },
+        'type' => {
+          'normalized' => ''
+        }
+      },
+      'structure' => {}
+    }
+  ]
+};
+$result_floats{'form_feeds'}{''}[0]{'extra'}{'caption'}{'extra'}{'float'} = 
$result_floats{'form_feeds'}{''}[0];
+
+
+$result_indices_sort_strings{'form_feeds'} = {
+  'fn' => [
+    'machin'
+  ]
+};
 
 
 
@@ -491,6 +1183,22 @@ $result_converted{'plaintext'}->{'form_feeds'} = 'aa
    ‘middlein code’
 
    *Note firstnode::
+
+     in example
+
+                             around center
+                               in center
+
+   ‘in indicateurl’
+
+ -- truc: machin bidule chose arg
+     T
+
+a float
+Toto
+
+in cation
+
 ';
 
 
@@ -520,7 +1228,26 @@ $result_converted{'html_text'}->{'form_feeds'} = '<a 
class="node-id" id="Top"></
 <p><code class="code">middle&#12; in code</code>
 </p>
 <p>See <a class="xref" href="#first-node">first&#12;node</a>
-</p>';
+</p>
+<div class="example">
+<pre class="example-preformatted">in example
+</pre></div>
+
+<div class="center">around center
+</div><div class="center">in &#12;center
+</div>
+<p>&lsquo;<code class="indicateurl">in indicateurl</code>&rsquo;
+</p>
+<dl class="first-deffn">
+<dt class="deffn" id="index-machin"><span class="category-def">truc: 
</span><span><strong class="def-name">machin</strong> <var 
class="def-var-arguments">bidule  chose arg</var><a class="copiable-link" 
href=\'#index-machin\'> &para;</a></span></dt>
+<dd><p>T
+</p></dd></dl>
+
+<div class="float">
+<p>a float
+</p><p>Toto
+</p><div class="caption"><p>in cation </p>&#12;</div></div>
+';
 
 
 $result_converted{'xml'}->{'form_feeds'} = '<node name="Top" spaces=" 
"><nodename>Top</nodename><nodenext 
automatic="on">first&formfeed;node</nodenext></node>
@@ -540,7 +1267,26 @@ $result_converted{'xml'}->{'form_feeds'} = '<node 
name="Top" spaces=" "><nodenam
 <para><code>middle&formfeed; in code</code>
 </para>
 <para><xref 
label="first-node"><xrefnodename>first&formfeed;node</xrefnodename></xref>
-</para>';
+</para>
+<example endspaces=" "> &formfeed;
+<pre xml:space="preserve">in example
+</pre></example>
+
+<center spaces=" \\f ">around center </center>
+<center spaces=" ">in &formfeed;center</center>
+
+<para><indicateurl spaces=" \\f ">in indicateurl</indicateurl>
+</para>
+<deffn spaces=" " endspaces=" "><definitionterm><indexterm index="fn" 
number="1">machin</indexterm><defcategory bracketed="on" spaces=" 
\\f">truc</defcategory> <deffunction bracketed="on" spaces=" 
">machin</deffunction>  <defparam bracketed="on" spaces=" ">bidule</defparam>  
<defparam bracketed="on" spaces=" \\f ">chose</defparam> <defparam 
bracketed="on" spaces="  ">arg</defparam></definitionterm>
+<definitionitem><para>T
+</para></definitionitem></deffn>
+
+<float type="" endspaces=" ">
+<para>a float
+</para><caption spaces="\\f "><para>in cation </para>&formfeed;</caption> 
&formfeed; <para>Toto
+</para></float> 
+
+';
 
 
 $result_converted{'docbook'}->{'form_feeds'} = '<anchor id="first-node"/>
@@ -558,7 +1304,21 @@ $result_converted{'docbook'}->{'form_feeds'} = '<anchor 
id="first-node"/>
 <para><literal>middle  in code</literal>
 </para>
 <para>See <link linkend="first-node">first node</link>
-</para>';
+</para>
+<screen>in example
+</screen>
+<simpara role="center">around center</simpara>
+<simpara role="center">in  center</simpara>
+
+<para><literal>in indicateurl</literal>
+</para>
+<synopsis><indexterm role="fn"><primary>machin</primary></indexterm><phrase 
role="category"><emphasis role="bold">truc</emphasis>:</phrase> 
<function>machin</function>  <emphasis role="arg">bidule</emphasis>  <emphasis 
role="arg">chose</emphasis> <emphasis role="arg">arg</emphasis></synopsis>
+<blockquote><para>T
+</para></blockquote>
+<para>a float
+</para><para>Toto
+</para>
+';
 
 
 $result_converted{'latex'}->{'form_feeds'} = '\\label{anchor:Top}%
@@ -579,6 +1339,41 @@ cc \\par{}
 \\texttt{middle in code}
 
 See \\hyperref[anchor:first-node]{[firstnode], 
page~\\pageref*{anchor:first-node}}
+
+\\begin{GNUTexinfopreformatted}
+\\leftskip=2em\\relax\\ttfamily%
+in example
+\\end{GNUTexinfopreformatted}
+
+\\begin{center}
+around center
+\\end{center}
+\\begin{center}
+in center
+\\end{center}
+
+`\\texttt{in indicateurl}\'
+
+
+\\noindent\\begin{tabularx}{\\linewidth}{@{}Xr}
+\\rightskip=5em plus 1 fill
+\\hangindent=2em
+\\texttt{machin \\EmbracOn{}\\textnormal{\\textsl{bidule  chose 
arg}}\\EmbracOff{}}& [truc]
+\\end{tabularx}
+
+\\index[fn]{machin@\\texttt{machin}}%
+\\begin{quote}
+\\unskip{\\parskip=0pt\\noindent}%
+T
+\\end{quote}
+
+\\begin{TexinfoFloat}
+a float
+\\caption{in cation \\par{}
+}
+\\par{}Toto
+\\end{TexinfoFloat}
+
 ';
 
 1;
diff --git a/tp/t/results/coverage_braces/empty_line_in_email.pl 
b/tp/t/results/coverage_braces/empty_line_in_email.pl
new file mode 100644
index 0000000000..9340b1cd31
--- /dev/null
+++ b/tp/t/results/coverage_braces/empty_line_in_email.pl
@@ -0,0 +1,152 @@
+use vars qw(%result_texis %result_texts %result_trees %result_errors 
+   %result_indices %result_sectioning %result_nodes %result_menus
+   %result_floats %result_converted %result_converted_errors 
+   %result_elements %result_directions_text %result_indices_sort_strings);
+
+use utf8;
+
+$result_trees{'empty_line_in_email'} = {
+  'contents' => [
+    {
+      'contents' => [
+        {
+          'contents' => [
+            {
+              'args' => [
+                {
+                  'contents' => [
+                    {
+                      'parent' => {},
+                      'text' => '
+',
+                      'type' => 'empty_line'
+                    }
+                  ],
+                  'extra' => {
+                    'spaces_before_argument' => ' 
+'
+                  },
+                  'parent' => {},
+                  'type' => 'brace_command_arg'
+                }
+              ],
+              'cmdname' => 'email',
+              'contents' => [],
+              'parent' => {},
+              'source_info' => {
+                'file_name' => '',
+                'line_nr' => 1,
+                'macro' => ''
+              }
+            }
+          ],
+          'parent' => {},
+          'type' => 'paragraph'
+        },
+        {
+          'contents' => [
+            {
+              'parent' => {},
+              'text' => 'mail,
+'
+            }
+          ],
+          'parent' => {},
+          'type' => 'paragraph'
+        },
+        {
+          'parent' => {},
+          'text' => '
+',
+          'type' => 'empty_line'
+        },
+        {
+          'contents' => [
+            {
+              'parent' => {},
+              'text' => 'text
+'
+            }
+          ],
+          'parent' => {},
+          'type' => 'paragraph'
+        }
+      ],
+      'parent' => {},
+      'type' => 'before_node_section'
+    }
+  ],
+  'type' => 'document_root'
+};
+$result_trees{'empty_line_in_email'}{'contents'}[0]{'contents'}[0]{'contents'}[0]{'args'}[0]{'contents'}[0]{'parent'}
 = 
$result_trees{'empty_line_in_email'}{'contents'}[0]{'contents'}[0]{'contents'}[0]{'args'}[0];
+$result_trees{'empty_line_in_email'}{'contents'}[0]{'contents'}[0]{'contents'}[0]{'args'}[0]{'parent'}
 = 
$result_trees{'empty_line_in_email'}{'contents'}[0]{'contents'}[0]{'contents'}[0];
+$result_trees{'empty_line_in_email'}{'contents'}[0]{'contents'}[0]{'contents'}[0]{'parent'}
 = $result_trees{'empty_line_in_email'}{'contents'}[0]{'contents'}[0];
+$result_trees{'empty_line_in_email'}{'contents'}[0]{'contents'}[0]{'parent'} = 
$result_trees{'empty_line_in_email'}{'contents'}[0];
+$result_trees{'empty_line_in_email'}{'contents'}[0]{'contents'}[1]{'contents'}[0]{'parent'}
 = $result_trees{'empty_line_in_email'}{'contents'}[0]{'contents'}[1];
+$result_trees{'empty_line_in_email'}{'contents'}[0]{'contents'}[1]{'parent'} = 
$result_trees{'empty_line_in_email'}{'contents'}[0];
+$result_trees{'empty_line_in_email'}{'contents'}[0]{'contents'}[2]{'parent'} = 
$result_trees{'empty_line_in_email'}{'contents'}[0];
+$result_trees{'empty_line_in_email'}{'contents'}[0]{'contents'}[3]{'contents'}[0]{'parent'}
 = $result_trees{'empty_line_in_email'}{'contents'}[0]{'contents'}[3];
+$result_trees{'empty_line_in_email'}{'contents'}[0]{'contents'}[3]{'parent'} = 
$result_trees{'empty_line_in_email'}{'contents'}[0];
+$result_trees{'empty_line_in_email'}{'contents'}[0]{'parent'} = 
$result_trees{'empty_line_in_email'};
+
+$result_texis{'empty_line_in_email'} = '@email{ 
+
+}mail,
+
+text
+';
+
+
+$result_texts{'empty_line_in_email'} = '
+mail,
+
+text
+';
+
+$result_errors{'empty_line_in_email'} = [
+  {
+    'error_line' => '@email missing closing brace
+',
+    'file_name' => '',
+    'line_nr' => 1,
+    'macro' => '',
+    'text' => '@email missing closing brace',
+    'type' => 'error'
+  },
+  {
+    'error_line' => 'misplaced }
+',
+    'file_name' => '',
+    'line_nr' => 6,
+    'macro' => '',
+    'text' => 'misplaced }',
+    'type' => 'error'
+  }
+];
+
+
+$result_floats{'empty_line_in_email'} = {};
+
+
+
+$result_converted{'plaintext'}->{'empty_line_in_email'} = '< >
+   mail,
+
+   text
+';
+
+
+$result_converted{'html_text'}->{'empty_line_in_email'} = '<p>mail,
+</p>
+<p>text
+</p>';
+
+
+$result_converted{'latex'}->{'empty_line_in_email'} = '\\href{mailto:
+}{\\nolinkurl{
+}}mail,
+
+text
+';
+
+1;
diff --git a/tp/t/results/include/cpp_lines.pl 
b/tp/t/results/include/cpp_lines.pl
index 50fe5ffdd7..ec127f6d34 100644
--- a/tp/t/results/include/cpp_lines.pl
+++ b/tp/t/results/include/cpp_lines.pl
@@ -675,6 +675,392 @@ $result_trees{'cpp_lines'} = {
         {
           'parent' => {},
           'text' => '
+',
+          'type' => 'empty_line'
+        },
+        {
+          'contents' => [
+            {
+              'parent' => {},
+              'text' => 'a'
+            },
+            {
+              'args' => [
+                {
+                  'contents' => [
+                    {
+                      'contents' => [
+                        {
+                          'parent' => {},
+                          'text' => 'in footnote'
+                        }
+                      ],
+                      'parent' => {},
+                      'type' => 'paragraph'
+                    }
+                  ],
+                  'parent' => {},
+                  'type' => 'brace_command_context'
+                }
+              ],
+              'cmdname' => 'footnote',
+              'contents' => [],
+              'extra' => {
+                'spaces_before_argument' => '
+'
+              },
+              'parent' => {},
+              'source_info' => {
+                'file_name' => 'g_f',
+                'line_nr' => 83,
+                'macro' => ''
+              }
+            },
+            {
+              'parent' => {},
+              'text' => '
+'
+            }
+          ],
+          'parent' => {},
+          'type' => 'paragraph'
+        },
+        {
+          'parent' => {},
+          'text' => '
+',
+          'type' => 'empty_line'
+        },
+        {
+          'contents' => [
+            {
+              'parent' => {},
+              'text' => 'a'
+            },
+            {
+              'args' => [
+                {
+                  'contents' => [
+                    {
+                      'parent' => {},
+                      'text' => '
+',
+                      'type' => 'empty_line'
+                    },
+                    {
+                      'contents' => [
+                        {
+                          'parent' => {},
+                          'text' => 'in 2footnote'
+                        }
+                      ],
+                      'parent' => {},
+                      'type' => 'paragraph'
+                    }
+                  ],
+                  'parent' => {},
+                  'type' => 'brace_command_context'
+                }
+              ],
+              'cmdname' => 'footnote',
+              'contents' => [],
+              'extra' => {
+                'spaces_before_argument' => '
+'
+              },
+              'parent' => {},
+              'source_info' => {
+                'file_name' => 'footnote',
+                'line_nr' => 28,
+                'macro' => ''
+              }
+            },
+            {
+              'parent' => {},
+              'text' => '
+'
+            }
+          ],
+          'parent' => {},
+          'type' => 'paragraph'
+        },
+        {
+          'parent' => {},
+          'text' => '
+',
+          'type' => 'empty_line'
+        },
+        {
+          'parent' => {},
+          'text' => '
+',
+          'type' => 'empty_line'
+        },
+        {
+          'contents' => [
+            {
+              'args' => [
+                {
+                  'contents' => [
+                    {
+                      'parent' => {},
+                      'text' => 'etext1'
+                    }
+                  ],
+                  'extra' => {
+                    'spaces_before_argument' => ' 
+'
+                  },
+                  'parent' => {},
+                  'type' => 'brace_command_arg'
+                },
+                {
+                  'contents' => [
+                    {
+                      'parent' => {},
+                      'text' => 'etext2'
+                    }
+                  ],
+                  'extra' => {
+                    'spaces_after_argument' => '
+',
+                    'spaces_before_argument' => '
+'
+                  },
+                  'parent' => {},
+                  'type' => 'brace_command_arg'
+                }
+              ],
+              'cmdname' => 'email',
+              'contents' => [],
+              'parent' => {},
+              'source_info' => {
+                'file_name' => 'footnote2',
+                'line_nr' => 40,
+                'macro' => ''
+              }
+            },
+            {
+              'parent' => {},
+              'text' => '
+'
+            }
+          ],
+          'parent' => {},
+          'type' => 'paragraph'
+        },
+        {
+          'parent' => {},
+          'text' => '
+',
+          'type' => 'empty_line'
+        },
+        {
+          'contents' => [
+            {
+              'args' => [
+                {
+                  'contents' => [
+                    {
+                      'parent' => {},
+                      'text' => ' no line directive mail space'
+                    }
+                  ],
+                  'extra' => {
+                    'spaces_before_argument' => '
+'
+                  },
+                  'parent' => {},
+                  'type' => 'brace_command_arg'
+                },
+                {
+                  'contents' => [
+                    {
+                      'parent' => {},
+                      'text' => ' no line directive text space'
+                    }
+                  ],
+                  'extra' => {
+                    'spaces_after_argument' => '
+',
+                    'spaces_before_argument' => '
+'
+                  },
+                  'parent' => {},
+                  'type' => 'brace_command_arg'
+                }
+              ],
+              'cmdname' => 'email',
+              'contents' => [],
+              'parent' => {},
+              'source_info' => {
+                'file_name' => 'email2',
+                'line_nr' => 64,
+                'macro' => ''
+              }
+            },
+            {
+              'parent' => {},
+              'text' => '
+'
+            }
+          ],
+          'parent' => {},
+          'type' => 'paragraph'
+        },
+        {
+          'parent' => {},
+          'text' => '
+',
+          'type' => 'empty_line'
+        },
+        {
+          'contents' => [
+            {
+              'args' => [
+                {
+                  'contents' => [
+                    {
+                      'parent' => {},
+                      'text' => ' mail space'
+                    }
+                  ],
+                  'extra' => {
+                    'spaces_before_argument' => ' 
+'
+                  },
+                  'parent' => {},
+                  'type' => 'brace_command_arg'
+                },
+                {
+                  'contents' => [
+                    {
+                      'parent' => {},
+                      'text' => ' text space'
+                    }
+                  ],
+                  'extra' => {
+                    'spaces_after_argument' => '
+',
+                    'spaces_before_argument' => '
+'
+                  },
+                  'parent' => {},
+                  'type' => 'brace_command_arg'
+                }
+              ],
+              'cmdname' => 'email',
+              'contents' => [],
+              'parent' => {},
+              'source_info' => {
+                'file_name' => 'email2',
+                'line_nr' => 69,
+                'macro' => ''
+              }
+            },
+            {
+              'parent' => {},
+              'text' => '
+'
+            }
+          ],
+          'parent' => {},
+          'type' => 'paragraph'
+        },
+        {
+          'parent' => {},
+          'text' => '
+',
+          'type' => 'empty_line'
+        },
+        {
+          'contents' => [
+            {
+              'args' => [
+                {
+                  'contents' => [
+                    {
+                      'parent' => {},
+                      'text' => '
+',
+                      'type' => 'empty_line'
+                    }
+                  ],
+                  'extra' => {
+                    'spaces_before_argument' => ' 
+'
+                  },
+                  'parent' => {},
+                  'type' => 'brace_command_arg'
+                }
+              ],
+              'cmdname' => 'email',
+              'contents' => [],
+              'parent' => {},
+              'source_info' => {
+                'file_name' => 'email12',
+                'line_nr' => 64,
+                'macro' => ''
+              }
+            }
+          ],
+          'parent' => {},
+          'type' => 'paragraph'
+        },
+        {
+          'contents' => [
+            {
+              'parent' => {},
+              'text' => 'etext3,
+'
+            }
+          ],
+          'parent' => {},
+          'type' => 'paragraph'
+        },
+        {
+          'parent' => {},
+          'text' => '
+',
+          'type' => 'empty_line'
+        },
+        {
+          'parent' => {},
+          'text' => '
+',
+          'type' => 'empty_line'
+        },
+        {
+          'contents' => [
+            {
+              'parent' => {},
+              'text' => 'etext4
+'
+            },
+            {
+              'parent' => {},
+              'text' => '
+'
+            }
+          ],
+          'parent' => {},
+          'type' => 'paragraph'
+        },
+        {
+          'parent' => {},
+          'text' => '
+',
+          'type' => 'empty_line'
+        },
+        {
+          'parent' => {},
+          'text' => '
+',
+          'type' => 'empty_line'
+        },
+        {
+          'parent' => {},
+          'text' => '
 ',
           'type' => 'empty_line'
         },
@@ -858,11 +1244,67 @@ 
$result_trees{'cpp_lines'}{'contents'}[1]{'contents'}[32]{'contents'}[0]{'parent
 
$result_trees{'cpp_lines'}{'contents'}[1]{'contents'}[32]{'contents'}[1]{'parent'}
 = $result_trees{'cpp_lines'}{'contents'}[1]{'contents'}[32];
 $result_trees{'cpp_lines'}{'contents'}[1]{'contents'}[32]{'parent'} = 
$result_trees{'cpp_lines'}{'contents'}[1];
 $result_trees{'cpp_lines'}{'contents'}[1]{'contents'}[33]{'parent'} = 
$result_trees{'cpp_lines'}{'contents'}[1];
+$result_trees{'cpp_lines'}{'contents'}[1]{'contents'}[34]{'contents'}[0]{'parent'}
 = $result_trees{'cpp_lines'}{'contents'}[1]{'contents'}[34];
+$result_trees{'cpp_lines'}{'contents'}[1]{'contents'}[34]{'contents'}[1]{'args'}[0]{'contents'}[0]{'contents'}[0]{'parent'}
 = 
$result_trees{'cpp_lines'}{'contents'}[1]{'contents'}[34]{'contents'}[1]{'args'}[0]{'contents'}[0];
+$result_trees{'cpp_lines'}{'contents'}[1]{'contents'}[34]{'contents'}[1]{'args'}[0]{'contents'}[0]{'parent'}
 = 
$result_trees{'cpp_lines'}{'contents'}[1]{'contents'}[34]{'contents'}[1]{'args'}[0];
+$result_trees{'cpp_lines'}{'contents'}[1]{'contents'}[34]{'contents'}[1]{'args'}[0]{'parent'}
 = $result_trees{'cpp_lines'}{'contents'}[1]{'contents'}[34]{'contents'}[1];
+$result_trees{'cpp_lines'}{'contents'}[1]{'contents'}[34]{'contents'}[1]{'parent'}
 = $result_trees{'cpp_lines'}{'contents'}[1]{'contents'}[34];
+$result_trees{'cpp_lines'}{'contents'}[1]{'contents'}[34]{'contents'}[2]{'parent'}
 = $result_trees{'cpp_lines'}{'contents'}[1]{'contents'}[34];
 $result_trees{'cpp_lines'}{'contents'}[1]{'contents'}[34]{'parent'} = 
$result_trees{'cpp_lines'}{'contents'}[1];
-$result_trees{'cpp_lines'}{'contents'}[1]{'contents'}[35]{'args'}[0]{'contents'}[0]{'parent'}
 = $result_trees{'cpp_lines'}{'contents'}[1]{'contents'}[35]{'args'}[0];
-$result_trees{'cpp_lines'}{'contents'}[1]{'contents'}[35]{'args'}[0]{'parent'} 
= $result_trees{'cpp_lines'}{'contents'}[1]{'contents'}[35];
 $result_trees{'cpp_lines'}{'contents'}[1]{'contents'}[35]{'parent'} = 
$result_trees{'cpp_lines'}{'contents'}[1];
+$result_trees{'cpp_lines'}{'contents'}[1]{'contents'}[36]{'contents'}[0]{'parent'}
 = $result_trees{'cpp_lines'}{'contents'}[1]{'contents'}[36];
+$result_trees{'cpp_lines'}{'contents'}[1]{'contents'}[36]{'contents'}[1]{'args'}[0]{'contents'}[0]{'parent'}
 = 
$result_trees{'cpp_lines'}{'contents'}[1]{'contents'}[36]{'contents'}[1]{'args'}[0];
+$result_trees{'cpp_lines'}{'contents'}[1]{'contents'}[36]{'contents'}[1]{'args'}[0]{'contents'}[1]{'contents'}[0]{'parent'}
 = 
$result_trees{'cpp_lines'}{'contents'}[1]{'contents'}[36]{'contents'}[1]{'args'}[0]{'contents'}[1];
+$result_trees{'cpp_lines'}{'contents'}[1]{'contents'}[36]{'contents'}[1]{'args'}[0]{'contents'}[1]{'parent'}
 = 
$result_trees{'cpp_lines'}{'contents'}[1]{'contents'}[36]{'contents'}[1]{'args'}[0];
+$result_trees{'cpp_lines'}{'contents'}[1]{'contents'}[36]{'contents'}[1]{'args'}[0]{'parent'}
 = $result_trees{'cpp_lines'}{'contents'}[1]{'contents'}[36]{'contents'}[1];
+$result_trees{'cpp_lines'}{'contents'}[1]{'contents'}[36]{'contents'}[1]{'parent'}
 = $result_trees{'cpp_lines'}{'contents'}[1]{'contents'}[36];
+$result_trees{'cpp_lines'}{'contents'}[1]{'contents'}[36]{'contents'}[2]{'parent'}
 = $result_trees{'cpp_lines'}{'contents'}[1]{'contents'}[36];
 $result_trees{'cpp_lines'}{'contents'}[1]{'contents'}[36]{'parent'} = 
$result_trees{'cpp_lines'}{'contents'}[1];
+$result_trees{'cpp_lines'}{'contents'}[1]{'contents'}[37]{'parent'} = 
$result_trees{'cpp_lines'}{'contents'}[1];
+$result_trees{'cpp_lines'}{'contents'}[1]{'contents'}[38]{'parent'} = 
$result_trees{'cpp_lines'}{'contents'}[1];
+$result_trees{'cpp_lines'}{'contents'}[1]{'contents'}[39]{'contents'}[0]{'args'}[0]{'contents'}[0]{'parent'}
 = 
$result_trees{'cpp_lines'}{'contents'}[1]{'contents'}[39]{'contents'}[0]{'args'}[0];
+$result_trees{'cpp_lines'}{'contents'}[1]{'contents'}[39]{'contents'}[0]{'args'}[0]{'parent'}
 = $result_trees{'cpp_lines'}{'contents'}[1]{'contents'}[39]{'contents'}[0];
+$result_trees{'cpp_lines'}{'contents'}[1]{'contents'}[39]{'contents'}[0]{'args'}[1]{'contents'}[0]{'parent'}
 = 
$result_trees{'cpp_lines'}{'contents'}[1]{'contents'}[39]{'contents'}[0]{'args'}[1];
+$result_trees{'cpp_lines'}{'contents'}[1]{'contents'}[39]{'contents'}[0]{'args'}[1]{'parent'}
 = $result_trees{'cpp_lines'}{'contents'}[1]{'contents'}[39]{'contents'}[0];
+$result_trees{'cpp_lines'}{'contents'}[1]{'contents'}[39]{'contents'}[0]{'parent'}
 = $result_trees{'cpp_lines'}{'contents'}[1]{'contents'}[39];
+$result_trees{'cpp_lines'}{'contents'}[1]{'contents'}[39]{'contents'}[1]{'parent'}
 = $result_trees{'cpp_lines'}{'contents'}[1]{'contents'}[39];
+$result_trees{'cpp_lines'}{'contents'}[1]{'contents'}[39]{'parent'} = 
$result_trees{'cpp_lines'}{'contents'}[1];
+$result_trees{'cpp_lines'}{'contents'}[1]{'contents'}[40]{'parent'} = 
$result_trees{'cpp_lines'}{'contents'}[1];
+$result_trees{'cpp_lines'}{'contents'}[1]{'contents'}[41]{'contents'}[0]{'args'}[0]{'contents'}[0]{'parent'}
 = 
$result_trees{'cpp_lines'}{'contents'}[1]{'contents'}[41]{'contents'}[0]{'args'}[0];
+$result_trees{'cpp_lines'}{'contents'}[1]{'contents'}[41]{'contents'}[0]{'args'}[0]{'parent'}
 = $result_trees{'cpp_lines'}{'contents'}[1]{'contents'}[41]{'contents'}[0];
+$result_trees{'cpp_lines'}{'contents'}[1]{'contents'}[41]{'contents'}[0]{'args'}[1]{'contents'}[0]{'parent'}
 = 
$result_trees{'cpp_lines'}{'contents'}[1]{'contents'}[41]{'contents'}[0]{'args'}[1];
+$result_trees{'cpp_lines'}{'contents'}[1]{'contents'}[41]{'contents'}[0]{'args'}[1]{'parent'}
 = $result_trees{'cpp_lines'}{'contents'}[1]{'contents'}[41]{'contents'}[0];
+$result_trees{'cpp_lines'}{'contents'}[1]{'contents'}[41]{'contents'}[0]{'parent'}
 = $result_trees{'cpp_lines'}{'contents'}[1]{'contents'}[41];
+$result_trees{'cpp_lines'}{'contents'}[1]{'contents'}[41]{'contents'}[1]{'parent'}
 = $result_trees{'cpp_lines'}{'contents'}[1]{'contents'}[41];
+$result_trees{'cpp_lines'}{'contents'}[1]{'contents'}[41]{'parent'} = 
$result_trees{'cpp_lines'}{'contents'}[1];
+$result_trees{'cpp_lines'}{'contents'}[1]{'contents'}[42]{'parent'} = 
$result_trees{'cpp_lines'}{'contents'}[1];
+$result_trees{'cpp_lines'}{'contents'}[1]{'contents'}[43]{'contents'}[0]{'args'}[0]{'contents'}[0]{'parent'}
 = 
$result_trees{'cpp_lines'}{'contents'}[1]{'contents'}[43]{'contents'}[0]{'args'}[0];
+$result_trees{'cpp_lines'}{'contents'}[1]{'contents'}[43]{'contents'}[0]{'args'}[0]{'parent'}
 = $result_trees{'cpp_lines'}{'contents'}[1]{'contents'}[43]{'contents'}[0];
+$result_trees{'cpp_lines'}{'contents'}[1]{'contents'}[43]{'contents'}[0]{'args'}[1]{'contents'}[0]{'parent'}
 = 
$result_trees{'cpp_lines'}{'contents'}[1]{'contents'}[43]{'contents'}[0]{'args'}[1];
+$result_trees{'cpp_lines'}{'contents'}[1]{'contents'}[43]{'contents'}[0]{'args'}[1]{'parent'}
 = $result_trees{'cpp_lines'}{'contents'}[1]{'contents'}[43]{'contents'}[0];
+$result_trees{'cpp_lines'}{'contents'}[1]{'contents'}[43]{'contents'}[0]{'parent'}
 = $result_trees{'cpp_lines'}{'contents'}[1]{'contents'}[43];
+$result_trees{'cpp_lines'}{'contents'}[1]{'contents'}[43]{'contents'}[1]{'parent'}
 = $result_trees{'cpp_lines'}{'contents'}[1]{'contents'}[43];
+$result_trees{'cpp_lines'}{'contents'}[1]{'contents'}[43]{'parent'} = 
$result_trees{'cpp_lines'}{'contents'}[1];
+$result_trees{'cpp_lines'}{'contents'}[1]{'contents'}[44]{'parent'} = 
$result_trees{'cpp_lines'}{'contents'}[1];
+$result_trees{'cpp_lines'}{'contents'}[1]{'contents'}[45]{'contents'}[0]{'args'}[0]{'contents'}[0]{'parent'}
 = 
$result_trees{'cpp_lines'}{'contents'}[1]{'contents'}[45]{'contents'}[0]{'args'}[0];
+$result_trees{'cpp_lines'}{'contents'}[1]{'contents'}[45]{'contents'}[0]{'args'}[0]{'parent'}
 = $result_trees{'cpp_lines'}{'contents'}[1]{'contents'}[45]{'contents'}[0];
+$result_trees{'cpp_lines'}{'contents'}[1]{'contents'}[45]{'contents'}[0]{'parent'}
 = $result_trees{'cpp_lines'}{'contents'}[1]{'contents'}[45];
+$result_trees{'cpp_lines'}{'contents'}[1]{'contents'}[45]{'parent'} = 
$result_trees{'cpp_lines'}{'contents'}[1];
+$result_trees{'cpp_lines'}{'contents'}[1]{'contents'}[46]{'contents'}[0]{'parent'}
 = $result_trees{'cpp_lines'}{'contents'}[1]{'contents'}[46];
+$result_trees{'cpp_lines'}{'contents'}[1]{'contents'}[46]{'parent'} = 
$result_trees{'cpp_lines'}{'contents'}[1];
+$result_trees{'cpp_lines'}{'contents'}[1]{'contents'}[47]{'parent'} = 
$result_trees{'cpp_lines'}{'contents'}[1];
+$result_trees{'cpp_lines'}{'contents'}[1]{'contents'}[48]{'parent'} = 
$result_trees{'cpp_lines'}{'contents'}[1];
+$result_trees{'cpp_lines'}{'contents'}[1]{'contents'}[49]{'contents'}[0]{'parent'}
 = $result_trees{'cpp_lines'}{'contents'}[1]{'contents'}[49];
+$result_trees{'cpp_lines'}{'contents'}[1]{'contents'}[49]{'contents'}[1]{'parent'}
 = $result_trees{'cpp_lines'}{'contents'}[1]{'contents'}[49];
+$result_trees{'cpp_lines'}{'contents'}[1]{'contents'}[49]{'parent'} = 
$result_trees{'cpp_lines'}{'contents'}[1];
+$result_trees{'cpp_lines'}{'contents'}[1]{'contents'}[50]{'parent'} = 
$result_trees{'cpp_lines'}{'contents'}[1];
+$result_trees{'cpp_lines'}{'contents'}[1]{'contents'}[51]{'parent'} = 
$result_trees{'cpp_lines'}{'contents'}[1];
+$result_trees{'cpp_lines'}{'contents'}[1]{'contents'}[52]{'parent'} = 
$result_trees{'cpp_lines'}{'contents'}[1];
+$result_trees{'cpp_lines'}{'contents'}[1]{'contents'}[53]{'parent'} = 
$result_trees{'cpp_lines'}{'contents'}[1];
+$result_trees{'cpp_lines'}{'contents'}[1]{'contents'}[54]{'args'}[0]{'contents'}[0]{'parent'}
 = $result_trees{'cpp_lines'}{'contents'}[1]{'contents'}[54]{'args'}[0];
+$result_trees{'cpp_lines'}{'contents'}[1]{'contents'}[54]{'args'}[0]{'parent'} 
= $result_trees{'cpp_lines'}{'contents'}[1]{'contents'}[54];
+$result_trees{'cpp_lines'}{'contents'}[1]{'contents'}[54]{'parent'} = 
$result_trees{'cpp_lines'}{'contents'}[1];
+$result_trees{'cpp_lines'}{'contents'}[1]{'contents'}[55]{'parent'} = 
$result_trees{'cpp_lines'}{'contents'}[1];
 $result_trees{'cpp_lines'}{'contents'}[1]{'extra'}{'node_content'}[0] = 
$result_trees{'cpp_lines'}{'contents'}[1]{'args'}[0]{'contents'}[0];
 
$result_trees{'cpp_lines'}{'contents'}[1]{'extra'}{'nodes_manuals'}[0]{'node_content'}[0]
 = $result_trees{'cpp_lines'}{'contents'}[1]{'args'}[0]{'contents'}[0];
 $result_trees{'cpp_lines'}{'contents'}[1]{'parent'} = 
$result_trees{'cpp_lines'};
@@ -919,6 +1361,39 @@ line before
 
 @email{after verb}
 
+a@footnote{
+in footnote}
+
+a@footnote{
+
+in 2footnote}
+
+
+@email{ 
+etext1,
+etext2
+}
+
+@email{
+ no line directive mail space,
+ no line directive text space
+}
+
+@email{ 
+ mail space,
+ text space
+}
+
+@email{ 
+
+}etext3,
+
+
+etext4
+
+
+
+
 
 @documentlanguage làng
 
@@ -964,6 +1439,26 @@ after inc.
 
 after verb
 
+a
+
+a
+
+
+etext2
+
+ no line directive text space
+
+ text space
+
+
+etext3,
+
+
+etext4
+
+
+
+
 
 
 ';
@@ -983,6 +1478,24 @@ $result_menus{'cpp_lines'} = {
 };
 
 $result_errors{'cpp_lines'} = [
+  {
+    'error_line' => '@email missing closing brace
+',
+    'file_name' => 'email12',
+    'line_nr' => 64,
+    'macro' => '',
+    'text' => '@email missing closing brace',
+    'type' => 'error'
+  },
+  {
+    'error_line' => 'misplaced }
+',
+    'file_name' => 'email4',
+    'line_nr' => 63,
+    'macro' => '',
+    'text' => 'misplaced }',
+    'type' => 'error'
+  },
   {
     'error_line' => "warning: l\x{e0}ng is not a valid language code
 ",
diff --git a/tp/tests/codeidx.idx b/tp/tests/codeidx.idx
new file mode 100644
index 0000000000..e69de29bb2
diff --git a/tp/tests/codeidx.ilg b/tp/tests/codeidx.ilg
new file mode 100644
index 0000000000..858f0cec49
--- /dev/null
+++ b/tp/tests/codeidx.ilg
@@ -0,0 +1,4 @@
+This is makeindex, version 2.16 [TeX Live 2022] (kpathsea + Thai support).
+Scanning input file codeidx.idx...done (0 entries accepted, 0 rejected).
+Nothing written in codeidx.ind.
+Transcript written in codeidx.ilg.
diff --git a/tp/tests/codeidx.ind b/tp/tests/codeidx.ind
new file mode 100644
index 0000000000..e69de29bb2
diff --git a/tp/tests/cp.idx b/tp/tests/cp.idx
new file mode 100644
index 0000000000..8f1b7c20e1
--- /dev/null
+++ b/tp/tests/cp.idx
@@ -0,0 +1,155 @@
+\indexentry{--option|hyperpage}{i}
+\indexentry{``|hyperpage}{i}
+\indexentry{vtable i--tem default kbdinputstyle@\texttt  {vtable i{-}{-}tem 
default kbdinputstyle}|hyperpage}{iii}
+\indexentry{vtable i--tem in example default kbdinputstyle@\texttt  {vtable 
i{-}{-}tem in example default kbdinputstyle}|hyperpage}{iii}
+\indexentry{vtable i--tem code kbdinputstyle@\texttt  {vtable i{-}{-}tem code 
kbdinputstyle}|hyperpage}{iii}
+\indexentry{vtable i--tem in example code kbdinputstyle@\texttt  {vtable 
i{-}{-}tem in example code kbdinputstyle}|hyperpage}{iii}
+\indexentry{vtable i--tem example kbdinputstyle@\texttt  {vtable i{-}{-}tem 
example kbdinputstyle}|hyperpage}{iii}
+\indexentry{vtable i--tem in example example kbdinputstyle@\texttt  {vtable 
i{-}{-}tem in example example kbdinputstyle}|hyperpage}{iv}
+\indexentry{vtable i--tem distinct kbdinputstyle@\texttt  {vtable i{-}{-}tem 
distinct kbdinputstyle}|hyperpage}{iv}
+\indexentry{vtable i--tem in example distinct kbdinputstyle@\texttt  {vtable 
i{-}{-}tem in example distinct kbdinputstyle}|hyperpage}{iv}
+\indexentry{index entry within itemize|hyperpage}{v}
+\indexentry{index entry within multitable|hyperpage}{vi}
+\indexentry{index entry within deffn|hyperpage}{vii}
+\indexentry{d--efvr\_name@\texttt{d{-}{-}efvr\_name}|hyperpage}{vii}
+\indexentry{d--eftypevr\_name@\texttt{d{-}{-}eftypevr\_name}|hyperpage}{vii}
+\indexentry{d--efcv\_name@\texttt{d{-}{-}efcv\_name}|hyperpage}{viii}
+\indexentry{d--efcv\_name@\texttt{d{-}{-}efcv\_name}|hyperpage}{viii}
+\indexentry{d--eftypecv\_name of c--lass@\texttt{d{-}{-}eftypecv\_name\ of 
c{-}{-}lass}|hyperpage}{viii}
+\indexentry{d--eftypecv\_name of c--lass@\texttt{d{-}{-}eftypecv\_name\ of 
c{-}{-}lass}|hyperpage}{viii}
+\indexentry{d--efvar\_name@\texttt{d{-}{-}efvar\_name}|hyperpage}{viii}
+\indexentry{d--efvar\_name@\texttt{d{-}{-}efvar\_name}|hyperpage}{viii}
+\indexentry{d--efopt\_name@\texttt{d{-}{-}efopt\_name}|hyperpage}{viii}
+\indexentry{d--eftypevar\_name@\texttt{d{-}{-}eftypevar\_name}|hyperpage}{viii}
+\indexentry{d--efivar\_name of c--lass@\texttt{d{-}{-}efivar\_name\ of 
c{-}{-}lass}|hyperpage}{viii}
+\indexentry{d--eftypeivar\_name of c--lass@\texttt{d{-}{-}eftypeivar\_name\ of 
c{-}{-}lass}|hyperpage}{ix}
+\indexentry{d--eftypecv\_name2 of c--lass2@\texttt{d{-}{-}eftypecv\_name2\ of 
c{-}{-}lass2}|hyperpage}{ix}
+\indexentry{d--eftypecv\_name2 of c--lass2@\texttt{d{-}{-}eftypecv\_name2\ of 
c{-}{-}lass2}|hyperpage}{ix}
+\indexentry{a--asis@\texttt  {a{-}{-}asis}|hyperpage}{x}
+\indexentry{b@\texttt  {b}|hyperpage}{x}
+\indexentry{index entry between item and itemx|hyperpage}{xi}
+\indexentry{index entry between item and itemx|hyperpage}{xiii}
+\indexentry{--option|hyperpage}{xiv}
+\indexentry{``|hyperpage}{xiv}
+\indexentry{vtable i--tem default kbdinputstyle@\texttt  {vtable i{-}{-}tem 
default kbdinputstyle}|hyperpage}{xvi}
+\indexentry{vtable i--tem in example default kbdinputstyle@\texttt  {vtable 
i{-}{-}tem in example default kbdinputstyle}|hyperpage}{xvi}
+\indexentry{vtable i--tem code kbdinputstyle@\texttt  {vtable i{-}{-}tem code 
kbdinputstyle}|hyperpage}{xvi}
+\indexentry{vtable i--tem in example code kbdinputstyle@\texttt  {vtable 
i{-}{-}tem in example code kbdinputstyle}|hyperpage}{xvi}
+\indexentry{vtable i--tem example kbdinputstyle@\texttt  {vtable i{-}{-}tem 
example kbdinputstyle}|hyperpage}{xvi}
+\indexentry{vtable i--tem in example example kbdinputstyle@\texttt  {vtable 
i{-}{-}tem in example example kbdinputstyle}|hyperpage}{xvii}
+\indexentry{vtable i--tem distinct kbdinputstyle@\texttt  {vtable i{-}{-}tem 
distinct kbdinputstyle}|hyperpage}{xvii}
+\indexentry{vtable i--tem in example distinct kbdinputstyle@\texttt  {vtable 
i{-}{-}tem in example distinct kbdinputstyle}|hyperpage}{xvii}
+\indexentry{index entry within itemize|hyperpage}{xviii}
+\indexentry{index entry within multitable|hyperpage}{xix}
+\indexentry{index entry within deffn|hyperpage}{xx}
+\indexentry{d--efvr\_name@\texttt{d{-}{-}efvr\_name}|hyperpage}{xx}
+\indexentry{d--eftypevr\_name@\texttt{d{-}{-}eftypevr\_name}|hyperpage}{xx}
+\indexentry{d--efcv\_name@\texttt{d{-}{-}efcv\_name}|hyperpage}{xxi}
+\indexentry{d--efcv\_name@\texttt{d{-}{-}efcv\_name}|hyperpage}{xxi}
+\indexentry{d--eftypecv\_name of c--lass@\texttt{d{-}{-}eftypecv\_name\ of 
c{-}{-}lass}|hyperpage}{xxi}
+\indexentry{d--eftypecv\_name of c--lass@\texttt{d{-}{-}eftypecv\_name\ of 
c{-}{-}lass}|hyperpage}{xxi}
+\indexentry{d--efvar\_name@\texttt{d{-}{-}efvar\_name}|hyperpage}{xxi}
+\indexentry{d--efvar\_name@\texttt{d{-}{-}efvar\_name}|hyperpage}{xxi}
+\indexentry{d--efopt\_name@\texttt{d{-}{-}efopt\_name}|hyperpage}{xxi}
+\indexentry{d--eftypevar\_name@\texttt{d{-}{-}eftypevar\_name}|hyperpage}{xxi}
+\indexentry{d--efivar\_name of c--lass@\texttt{d{-}{-}efivar\_name\ of 
c{-}{-}lass}|hyperpage}{xxi}
+\indexentry{d--eftypeivar\_name of c--lass@\texttt{d{-}{-}eftypeivar\_name\ of 
c{-}{-}lass}|hyperpage}{xxii}
+\indexentry{d--eftypecv\_name2 of c--lass2@\texttt{d{-}{-}eftypecv\_name2\ of 
c{-}{-}lass2}|hyperpage}{xxii}
+\indexentry{d--eftypecv\_name2 of c--lass2@\texttt{d{-}{-}eftypecv\_name2\ of 
c{-}{-}lass2}|hyperpage}{xxii}
+\indexentry{a--asis@\texttt  {a{-}{-}asis}|hyperpage}{xxiii}
+\indexentry{b@\texttt  {b}|hyperpage}{xxiii}
+\indexentry{index entry between item and itemx|hyperpage}{xxiv}
+\indexentry{index entry between item and itemx|hyperpage}{xxvi}
+\indexentry{--option|hyperpage}{2}
+\indexentry{``|hyperpage}{2}
+\indexentry{vtable i--tem default kbdinputstyle@\texttt  {vtable i{-}{-}tem 
default kbdinputstyle}|hyperpage}{4}
+\indexentry{vtable i--tem in example default kbdinputstyle@\texttt  {vtable 
i{-}{-}tem in example default kbdinputstyle}|hyperpage}{4}
+\indexentry{vtable i--tem code kbdinputstyle@\texttt  {vtable i{-}{-}tem code 
kbdinputstyle}|hyperpage}{4}
+\indexentry{vtable i--tem in example code kbdinputstyle@\texttt  {vtable 
i{-}{-}tem in example code kbdinputstyle}|hyperpage}{4}
+\indexentry{vtable i--tem example kbdinputstyle@\texttt  {vtable i{-}{-}tem 
example kbdinputstyle}|hyperpage}{4}
+\indexentry{vtable i--tem in example example kbdinputstyle@\texttt  {vtable 
i{-}{-}tem in example example kbdinputstyle}|hyperpage}{5}
+\indexentry{vtable i--tem distinct kbdinputstyle@\texttt  {vtable i{-}{-}tem 
distinct kbdinputstyle}|hyperpage}{5}
+\indexentry{vtable i--tem in example distinct kbdinputstyle@\texttt  {vtable 
i{-}{-}tem in example distinct kbdinputstyle}|hyperpage}{5}
+\indexentry{index entry within itemize|hyperpage}{6}
+\indexentry{index entry within multitable|hyperpage}{7}
+\indexentry{index entry within deffn|hyperpage}{8}
+\indexentry{d--efvr\_name@\texttt{d{-}{-}efvr\_name}|hyperpage}{8}
+\indexentry{d--eftypevr\_name@\texttt{d{-}{-}eftypevr\_name}|hyperpage}{8}
+\indexentry{d--efcv\_name@\texttt{d{-}{-}efcv\_name}|hyperpage}{9}
+\indexentry{d--efcv\_name@\texttt{d{-}{-}efcv\_name}|hyperpage}{9}
+\indexentry{d--eftypecv\_name of c--lass@\texttt{d{-}{-}eftypecv\_name\ of 
c{-}{-}lass}|hyperpage}{9}
+\indexentry{d--eftypecv\_name of c--lass@\texttt{d{-}{-}eftypecv\_name\ of 
c{-}{-}lass}|hyperpage}{9}
+\indexentry{d--efvar\_name@\texttt{d{-}{-}efvar\_name}|hyperpage}{9}
+\indexentry{d--efvar\_name@\texttt{d{-}{-}efvar\_name}|hyperpage}{9}
+\indexentry{d--efopt\_name@\texttt{d{-}{-}efopt\_name}|hyperpage}{9}
+\indexentry{d--eftypevar\_name@\texttt{d{-}{-}eftypevar\_name}|hyperpage}{9}
+\indexentry{d--efivar\_name of c--lass@\texttt{d{-}{-}efivar\_name\ of 
c{-}{-}lass}|hyperpage}{9}
+\indexentry{d--eftypeivar\_name of c--lass@\texttt{d{-}{-}eftypeivar\_name\ of 
c{-}{-}lass}|hyperpage}{10}
+\indexentry{d--eftypecv\_name2 of c--lass2@\texttt{d{-}{-}eftypecv\_name2\ of 
c{-}{-}lass2}|hyperpage}{10}
+\indexentry{d--eftypecv\_name2 of c--lass2@\texttt{d{-}{-}eftypecv\_name2\ of 
c{-}{-}lass2}|hyperpage}{10}
+\indexentry{a--asis@\texttt  {a{-}{-}asis}|hyperpage}{11}
+\indexentry{b@\texttt  {b}|hyperpage}{11}
+\indexentry{index entry between item and itemx|hyperpage}{12}
+\indexentry{index entry between item and itemx|hyperpage}{14}
+\indexentry{--option|hyperpage}{15}
+\indexentry{``|hyperpage}{15}
+\indexentry{vtable i--tem default kbdinputstyle@\texttt  {vtable i{-}{-}tem 
default kbdinputstyle}|hyperpage}{17}
+\indexentry{vtable i--tem in example default kbdinputstyle@\texttt  {vtable 
i{-}{-}tem in example default kbdinputstyle}|hyperpage}{17}
+\indexentry{vtable i--tem code kbdinputstyle@\texttt  {vtable i{-}{-}tem code 
kbdinputstyle}|hyperpage}{17}
+\indexentry{vtable i--tem in example code kbdinputstyle@\texttt  {vtable 
i{-}{-}tem in example code kbdinputstyle}|hyperpage}{17}
+\indexentry{vtable i--tem example kbdinputstyle@\texttt  {vtable i{-}{-}tem 
example kbdinputstyle}|hyperpage}{17}
+\indexentry{vtable i--tem in example example kbdinputstyle@\texttt  {vtable 
i{-}{-}tem in example example kbdinputstyle}|hyperpage}{18}
+\indexentry{vtable i--tem distinct kbdinputstyle@\texttt  {vtable i{-}{-}tem 
distinct kbdinputstyle}|hyperpage}{18}
+\indexentry{vtable i--tem in example distinct kbdinputstyle@\texttt  {vtable 
i{-}{-}tem in example distinct kbdinputstyle}|hyperpage}{18}
+\indexentry{index entry within itemize|hyperpage}{19}
+\indexentry{index entry within multitable|hyperpage}{20}
+\indexentry{index entry within deffn|hyperpage}{21}
+\indexentry{d--efvr\_name@\texttt{d{-}{-}efvr\_name}|hyperpage}{21}
+\indexentry{d--eftypevr\_name@\texttt{d{-}{-}eftypevr\_name}|hyperpage}{21}
+\indexentry{d--efcv\_name@\texttt{d{-}{-}efcv\_name}|hyperpage}{22}
+\indexentry{d--efcv\_name@\texttt{d{-}{-}efcv\_name}|hyperpage}{22}
+\indexentry{d--eftypecv\_name of c--lass@\texttt{d{-}{-}eftypecv\_name\ of 
c{-}{-}lass}|hyperpage}{22}
+\indexentry{d--eftypecv\_name of c--lass@\texttt{d{-}{-}eftypecv\_name\ of 
c{-}{-}lass}|hyperpage}{22}
+\indexentry{d--efvar\_name@\texttt{d{-}{-}efvar\_name}|hyperpage}{22}
+\indexentry{d--efvar\_name@\texttt{d{-}{-}efvar\_name}|hyperpage}{22}
+\indexentry{d--efopt\_name@\texttt{d{-}{-}efopt\_name}|hyperpage}{22}
+\indexentry{d--eftypevar\_name@\texttt{d{-}{-}eftypevar\_name}|hyperpage}{22}
+\indexentry{d--efivar\_name of c--lass@\texttt{d{-}{-}efivar\_name\ of 
c{-}{-}lass}|hyperpage}{22}
+\indexentry{d--eftypeivar\_name of c--lass@\texttt{d{-}{-}eftypeivar\_name\ of 
c{-}{-}lass}|hyperpage}{23}
+\indexentry{d--eftypecv\_name2 of c--lass2@\texttt{d{-}{-}eftypecv\_name2\ of 
c{-}{-}lass2}|hyperpage}{23}
+\indexentry{d--eftypecv\_name2 of c--lass2@\texttt{d{-}{-}eftypecv\_name2\ of 
c{-}{-}lass2}|hyperpage}{23}
+\indexentry{a--asis@\texttt  {a{-}{-}asis}|hyperpage}{24}
+\indexentry{b@\texttt  {b}|hyperpage}{24}
+\indexentry{index entry between item and itemx|hyperpage}{25}
+\indexentry{index entry between item and itemx|hyperpage}{27}
+\indexentry{--option|hyperpage}{29}
+\indexentry{``|hyperpage}{29}
+\indexentry{vtable i--tem default kbdinputstyle@\texttt  {vtable i{-}{-}tem 
default kbdinputstyle}|hyperpage}{33}
+\indexentry{vtable i--tem in example default kbdinputstyle@\texttt  {vtable 
i{-}{-}tem in example default kbdinputstyle}|hyperpage}{33}
+\indexentry{vtable i--tem code kbdinputstyle@\texttt  {vtable i{-}{-}tem code 
kbdinputstyle}|hyperpage}{33}
+\indexentry{vtable i--tem in example code kbdinputstyle@\texttt  {vtable 
i{-}{-}tem in example code kbdinputstyle}|hyperpage}{33}
+\indexentry{vtable i--tem example kbdinputstyle@\texttt  {vtable i{-}{-}tem 
example kbdinputstyle}|hyperpage}{33}
+\indexentry{vtable i--tem in example example kbdinputstyle@\texttt  {vtable 
i{-}{-}tem in example example kbdinputstyle}|hyperpage}{34}
+\indexentry{vtable i--tem distinct kbdinputstyle@\texttt  {vtable i{-}{-}tem 
distinct kbdinputstyle}|hyperpage}{34}
+\indexentry{vtable i--tem in example distinct kbdinputstyle@\texttt  {vtable 
i{-}{-}tem in example distinct kbdinputstyle}|hyperpage}{34}
+\indexentry{index entry within itemize|hyperpage}{35}
+\indexentry{index entry within multitable|hyperpage}{36}
+\indexentry{index entry within deffn|hyperpage}{37}
+\indexentry{d--efvr\_name@\texttt{d{-}{-}efvr\_name}|hyperpage}{37}
+\indexentry{d--eftypevr\_name@\texttt{d{-}{-}eftypevr\_name}|hyperpage}{38}
+\indexentry{d--efcv\_name@\texttt{d{-}{-}efcv\_name}|hyperpage}{38}
+\indexentry{d--efcv\_name@\texttt{d{-}{-}efcv\_name}|hyperpage}{38}
+\indexentry{d--eftypecv\_name of c--lass@\texttt{d{-}{-}eftypecv\_name\ of 
c{-}{-}lass}|hyperpage}{38}
+\indexentry{d--eftypecv\_name of c--lass@\texttt{d{-}{-}eftypecv\_name\ of 
c{-}{-}lass}|hyperpage}{38}
+\indexentry{d--efvar\_name@\texttt{d{-}{-}efvar\_name}|hyperpage}{39}
+\indexentry{d--efvar\_name@\texttt{d{-}{-}efvar\_name}|hyperpage}{39}
+\indexentry{d--efopt\_name@\texttt{d{-}{-}efopt\_name}|hyperpage}{39}
+\indexentry{d--eftypevar\_name@\texttt{d{-}{-}eftypevar\_name}|hyperpage}{39}
+\indexentry{d--efivar\_name of c--lass@\texttt{d{-}{-}efivar\_name\ of 
c{-}{-}lass}|hyperpage}{39}
+\indexentry{d--eftypeivar\_name of c--lass@\texttt{d{-}{-}eftypeivar\_name\ of 
c{-}{-}lass}|hyperpage}{39}
+\indexentry{d--eftypecv\_name2 of c--lass2@\texttt{d{-}{-}eftypecv\_name2\ of 
c{-}{-}lass2}|hyperpage}{40}
+\indexentry{d--eftypecv\_name2 of c--lass2@\texttt{d{-}{-}eftypecv\_name2\ of 
c{-}{-}lass2}|hyperpage}{40}
+\indexentry{a--asis@\texttt  {a{-}{-}asis}|hyperpage}{42}
+\indexentry{b@\texttt  {b}|hyperpage}{42}
+\indexentry{index entry between item and itemx|hyperpage}{42}
+\indexentry{index entry between item and itemx|hyperpage}{45}
diff --git a/tp/tests/cp.ilg b/tp/tests/cp.ilg
new file mode 100644
index 0000000000..a8910668c8
--- /dev/null
+++ b/tp/tests/cp.ilg
@@ -0,0 +1,6 @@
+This is makeindex, version 2.16 [TeX Live 2022] (kpathsea + Thai support).
+Scanning input file cp.idx....done (155 entries accepted, 0 rejected).
+Sorting entries....done (1251 comparisons).
+Generating output file cp.ind....done (86 lines written, 0 warnings).
+Output written in cp.ind.
+Transcript written in cp.ilg.
diff --git a/tp/tests/cp.ind b/tp/tests/cp.ind
new file mode 100644
index 0000000000..12b7db4968
--- /dev/null
+++ b/tp/tests/cp.ind
@@ -0,0 +1,86 @@
+\begin{theindex}
+
+  \item --option, \hyperpage{i}, \hyperpage{xiv}, \hyperpage{2}, 
+               \hyperpage{15}, \hyperpage{29}
+  \item ``, \hyperpage{i}, \hyperpage{xiv}, \hyperpage{2}, 
+               \hyperpage{15}, \hyperpage{29}
+
+  \indexspace
+
+  \item \texttt  {a{-}{-}asis}, \hyperpage{x}, \hyperpage{xxiii}, 
+               \hyperpage{11}, \hyperpage{24}, \hyperpage{42}
+
+  \indexspace
+
+  \item \texttt  {b}, \hyperpage{x}, \hyperpage{xxiii}, \hyperpage{11}, 
+               \hyperpage{24}, \hyperpage{42}
+
+  \indexspace
+
+  \item \texttt{d{-}{-}efcv\_name}, \hyperpage{viii}, \hyperpage{xxi}, 
+               \hyperpage{9}, \hyperpage{22}, \hyperpage{38}
+  \item \texttt{d{-}{-}efivar\_name\ of c{-}{-}lass}, \hyperpage{viii}, 
+               \hyperpage{xxi}, \hyperpage{9}, \hyperpage{22}, 
+               \hyperpage{39}
+  \item \texttt{d{-}{-}efopt\_name}, \hyperpage{viii}, \hyperpage{xxi}, 
+               \hyperpage{9}, \hyperpage{22}, \hyperpage{39}
+  \item \texttt{d{-}{-}eftypecv\_name\ of c{-}{-}lass}, 
+               \hyperpage{viii}, \hyperpage{xxi}, \hyperpage{9}, 
+               \hyperpage{22}, \hyperpage{38}
+  \item \texttt{d{-}{-}eftypecv\_name2\ of c{-}{-}lass2}, 
+               \hyperpage{ix}, \hyperpage{xxii}, \hyperpage{10}, 
+               \hyperpage{23}, \hyperpage{40}
+  \item \texttt{d{-}{-}eftypeivar\_name\ of c{-}{-}lass}, 
+               \hyperpage{ix}, \hyperpage{xxii}, \hyperpage{10}, 
+               \hyperpage{23}, \hyperpage{39}
+  \item \texttt{d{-}{-}eftypevar\_name}, \hyperpage{viii}, 
+               \hyperpage{xxi}, \hyperpage{9}, \hyperpage{22}, 
+               \hyperpage{39}
+  \item \texttt{d{-}{-}eftypevr\_name}, \hyperpage{vii}, \hyperpage{xx}, 
+               \hyperpage{8}, \hyperpage{21}, \hyperpage{38}
+  \item \texttt{d{-}{-}efvar\_name}, \hyperpage{viii}, \hyperpage{xxi}, 
+               \hyperpage{9}, \hyperpage{22}, \hyperpage{39}
+  \item \texttt{d{-}{-}efvr\_name}, \hyperpage{vii}, \hyperpage{xx}, 
+               \hyperpage{8}, \hyperpage{21}, \hyperpage{37}
+
+  \indexspace
+
+  \item index entry between item and itemx, \hyperpage{xi}, 
+               \hyperpage{xiii}, \hyperpage{xxiv}, \hyperpage{xxvi}, 
+               \hyperpage{12}, \hyperpage{14}, \hyperpage{25}, 
+               \hyperpage{27}, \hyperpage{42}, \hyperpage{45}
+  \item index entry within deffn, \hyperpage{vii}, \hyperpage{xx}, 
+               \hyperpage{8}, \hyperpage{21}, \hyperpage{37}
+  \item index entry within itemize, \hyperpage{v}, \hyperpage{xviii}, 
+               \hyperpage{6}, \hyperpage{19}, \hyperpage{35}
+  \item index entry within multitable, \hyperpage{vi}, \hyperpage{xix}, 
+               \hyperpage{7}, \hyperpage{20}, \hyperpage{36}
+
+  \indexspace
+
+  \item \texttt  {vtable i{-}{-}tem code kbdinputstyle}, 
+               \hyperpage{iii}, \hyperpage{xvi}, \hyperpage{4}, 
+               \hyperpage{17}, \hyperpage{33}
+  \item \texttt  {vtable i{-}{-}tem default kbdinputstyle}, 
+               \hyperpage{iii}, \hyperpage{xvi}, \hyperpage{4}, 
+               \hyperpage{17}, \hyperpage{33}
+  \item \texttt  {vtable i{-}{-}tem distinct kbdinputstyle}, 
+               \hyperpage{iv}, \hyperpage{xvii}, \hyperpage{5}, 
+               \hyperpage{18}, \hyperpage{34}
+  \item \texttt  {vtable i{-}{-}tem example kbdinputstyle}, 
+               \hyperpage{iii}, \hyperpage{xvi}, \hyperpage{4}, 
+               \hyperpage{17}, \hyperpage{33}
+  \item \texttt  {vtable i{-}{-}tem in example code kbdinputstyle}, 
+               \hyperpage{iii}, \hyperpage{xvi}, \hyperpage{4}, 
+               \hyperpage{17}, \hyperpage{33}
+  \item \texttt  {vtable i{-}{-}tem in example default kbdinputstyle}, 
+               \hyperpage{iii}, \hyperpage{xvi}, \hyperpage{4}, 
+               \hyperpage{17}, \hyperpage{33}
+  \item \texttt  {vtable i{-}{-}tem in example distinct kbdinputstyle}, 
+               \hyperpage{iv}, \hyperpage{xvii}, \hyperpage{5}, 
+               \hyperpage{18}, \hyperpage{34}
+  \item \texttt  {vtable i{-}{-}tem in example example kbdinputstyle}, 
+               \hyperpage{iv}, \hyperpage{xvii}, \hyperpage{5}, 
+               \hyperpage{18}, \hyperpage{34}
+
+\end{theindex}
diff --git a/tp/tests/fn.idx b/tp/tests/fn.idx
new file mode 100644
index 0000000000..9ef377be65
--- /dev/null
+++ b/tp/tests/fn.idx
@@ -0,0 +1,274 @@
+\indexentry{``@\texttt{{`}{`}}|hyperpage}{i}
+\indexentry{--foption@\texttt{{-}{-}foption}|hyperpage}{i}
+\indexentry{d--effn\_name@\texttt{d{-}{-}effn\_name}|hyperpage}{vi}
+\indexentry{de--ffn\_name@\texttt{de{-}{-}ffn\_name}|hyperpage}{vi}
+\indexentry{i@\texttt{\GNUTexinfocommandstyletextvar{i}}|hyperpage}{vii}
+\indexentry{truc@\texttt{truc}|hyperpage}{vii}
+\indexentry{log trap@\texttt{log trap}|hyperpage}{vii}
+\indexentry{log trap1@\texttt{log trap1}|hyperpage}{vii}
+\indexentry{log trap2@\texttt{log trap2}|hyperpage}{vii}
+\indexentry{id ule@\texttt{\textbf{id ule}}|hyperpage}{vii}
+\indexentry{id i ule@\texttt{\textbf{id `\texttt{i}'\ ule}}|hyperpage}{vii}
+\indexentry{machin@\texttt{machin}|hyperpage}{vii}
+\indexentry{bidule machin@\texttt{bidule machin}|hyperpage}{vii}
+\indexentry{machin@\texttt{machin}|hyperpage}{vii}
+\indexentry{followed@\texttt{followed}|hyperpage}{vii}
+\indexentry{a@\texttt{a}|hyperpage}{vii}
+\indexentry{deffnx@\texttt{deffnx}|hyperpage}{vii}
+\indexentry{deffn@\texttt{deffn}|hyperpage}{vii}
+\indexentry{deffn@\texttt{deffn}|hyperpage}{vii}
+\indexentry{deffnx@\texttt{deffnx}|hyperpage}{vii}
+\indexentry{i@\texttt{\GNUTexinfocommandstyletextvar{i}}|hyperpage}{vii}
+\indexentry{truc@\texttt{truc}|hyperpage}{vii}
+\indexentry{n--ame@\texttt{n{-}{-}ame}|hyperpage}{vii}
+\indexentry{n--ame@\texttt{n{-}{-}ame}|hyperpage}{vii}
+\indexentry{d--eftypefn\_name@\texttt{d{-}{-}eftypefn\_name}|hyperpage}{vii}
+\indexentry{d--eftypefn\_name@\texttt{d{-}{-}eftypefn\_name}|hyperpage}{vii}
+\indexentry{d--eftypeop\_name on c--lass@\texttt{d{-}{-}eftypeop\_name\ on 
c{-}{-}lass}|hyperpage}{vii}
+\indexentry{d--eftypeop\_name on c--lass@\texttt{d{-}{-}eftypeop\_name\ on 
c{-}{-}lass}|hyperpage}{vii}
+\indexentry{d--efop\_name on c--lass@\texttt{d{-}{-}efop\_name\ on 
c{-}{-}lass}|hyperpage}{viii}
+\indexentry{d--efop\_name on c--lass@\texttt{d{-}{-}efop\_name\ on 
c{-}{-}lass}|hyperpage}{viii}
+\indexentry{d--efun\_name@\texttt{d{-}{-}efun\_name}|hyperpage}{viii}
+\indexentry{d--efmac\_name@\texttt{d{-}{-}efmac\_name}|hyperpage}{viii}
+\indexentry{d--efspec\_name@\texttt{d{-}{-}efspec\_name}|hyperpage}{viii}
+\indexentry{d--eftypefun\_name@\texttt{d{-}{-}eftypefun\_name}|hyperpage}{viii}
+\indexentry{d--efmethod\_name on c--lass@\texttt{d{-}{-}efmethod\_name\ on 
c{-}{-}lass}|hyperpage}{ix}
+\indexentry{d--eftypemethod\_name on 
c--lass@\texttt{d{-}{-}eftypemethod\_name\ on c{-}{-}lass}|hyperpage}{ix}
+\indexentry{name2@\texttt{name2}|hyperpage}{ix}
+\indexentry{d--eftypefn\_name2@\texttt{d{-}{-}eftypefn\_name2}|hyperpage}{ix}
+\indexentry{d--eftypeop\_name2 on c--lass2@\texttt{d{-}{-}eftypeop\_name2\ on 
c{-}{-}lass2}|hyperpage}{ix}
+\indexentry{d--eftypeop\_name2 on c--lass2@\texttt{d{-}{-}eftypeop\_name2\ on 
c{-}{-}lass2}|hyperpage}{ix}
+\indexentry{arg2@\texttt{arg2}|hyperpage}{ix}
+\indexentry{a@\texttt  {a}|hyperpage}{xi}
+\indexentry{b@\texttt  {b}|hyperpage}{xi}
+\indexentry{a@\texttt  {a}|hyperpage}{xiii}
+\indexentry{b@\texttt  {b}|hyperpage}{xiii}
+\indexentry{machin@\texttt{machin}|hyperpage}{xiii}
+\indexentry{machin@\texttt{machin}|hyperpage}{xiii}
+\indexentry{machin@\texttt{machin}|hyperpage}{xiii}
+\indexentry{machin@\texttt{machin}|hyperpage}{xiii}
+\indexentry{followed@\texttt{followed}|hyperpage}{xiii}
+\indexentry{after@\texttt{after}|hyperpage}{xiv}
+\indexentry{invalid@\texttt{\GNUTexinfocommandstyletextvar{invalid}}|hyperpage}{xiv}
+\indexentry{``@\texttt{{`}{`}}|hyperpage}{xiv}
+\indexentry{--foption@\texttt{{-}{-}foption}|hyperpage}{xiv}
+\indexentry{d--effn\_name@\texttt{d{-}{-}effn\_name}|hyperpage}{xix}
+\indexentry{de--ffn\_name@\texttt{de{-}{-}ffn\_name}|hyperpage}{xix}
+\indexentry{i@\texttt{\GNUTexinfocommandstyletextvar{i}}|hyperpage}{xx}
+\indexentry{truc@\texttt{truc}|hyperpage}{xx}
+\indexentry{log trap@\texttt{log trap}|hyperpage}{xx}
+\indexentry{log trap1@\texttt{log trap1}|hyperpage}{xx}
+\indexentry{log trap2@\texttt{log trap2}|hyperpage}{xx}
+\indexentry{id ule@\texttt{\textbf{id ule}}|hyperpage}{xx}
+\indexentry{id i ule@\texttt{\textbf{id `\texttt{i}'\ ule}}|hyperpage}{xx}
+\indexentry{machin@\texttt{machin}|hyperpage}{xx}
+\indexentry{bidule machin@\texttt{bidule machin}|hyperpage}{xx}
+\indexentry{machin@\texttt{machin}|hyperpage}{xx}
+\indexentry{followed@\texttt{followed}|hyperpage}{xx}
+\indexentry{a@\texttt{a}|hyperpage}{xx}
+\indexentry{deffnx@\texttt{deffnx}|hyperpage}{xx}
+\indexentry{deffn@\texttt{deffn}|hyperpage}{xx}
+\indexentry{deffn@\texttt{deffn}|hyperpage}{xx}
+\indexentry{deffnx@\texttt{deffnx}|hyperpage}{xx}
+\indexentry{i@\texttt{\GNUTexinfocommandstyletextvar{i}}|hyperpage}{xx}
+\indexentry{truc@\texttt{truc}|hyperpage}{xx}
+\indexentry{n--ame@\texttt{n{-}{-}ame}|hyperpage}{xx}
+\indexentry{n--ame@\texttt{n{-}{-}ame}|hyperpage}{xx}
+\indexentry{d--eftypefn\_name@\texttt{d{-}{-}eftypefn\_name}|hyperpage}{xx}
+\indexentry{d--eftypefn\_name@\texttt{d{-}{-}eftypefn\_name}|hyperpage}{xx}
+\indexentry{d--eftypeop\_name on c--lass@\texttt{d{-}{-}eftypeop\_name\ on 
c{-}{-}lass}|hyperpage}{xx}
+\indexentry{d--eftypeop\_name on c--lass@\texttt{d{-}{-}eftypeop\_name\ on 
c{-}{-}lass}|hyperpage}{xx}
+\indexentry{d--efop\_name on c--lass@\texttt{d{-}{-}efop\_name\ on 
c{-}{-}lass}|hyperpage}{xxi}
+\indexentry{d--efop\_name on c--lass@\texttt{d{-}{-}efop\_name\ on 
c{-}{-}lass}|hyperpage}{xxi}
+\indexentry{d--efun\_name@\texttt{d{-}{-}efun\_name}|hyperpage}{xxi}
+\indexentry{d--efmac\_name@\texttt{d{-}{-}efmac\_name}|hyperpage}{xxi}
+\indexentry{d--efspec\_name@\texttt{d{-}{-}efspec\_name}|hyperpage}{xxi}
+\indexentry{d--eftypefun\_name@\texttt{d{-}{-}eftypefun\_name}|hyperpage}{xxi}
+\indexentry{d--efmethod\_name on c--lass@\texttt{d{-}{-}efmethod\_name\ on 
c{-}{-}lass}|hyperpage}{xxii}
+\indexentry{d--eftypemethod\_name on 
c--lass@\texttt{d{-}{-}eftypemethod\_name\ on c{-}{-}lass}|hyperpage}{xxii}
+\indexentry{name2@\texttt{name2}|hyperpage}{xxii}
+\indexentry{d--eftypefn\_name2@\texttt{d{-}{-}eftypefn\_name2}|hyperpage}{xxii}
+\indexentry{d--eftypeop\_name2 on c--lass2@\texttt{d{-}{-}eftypeop\_name2\ on 
c{-}{-}lass2}|hyperpage}{xxii}
+\indexentry{d--eftypeop\_name2 on c--lass2@\texttt{d{-}{-}eftypeop\_name2\ on 
c{-}{-}lass2}|hyperpage}{xxii}
+\indexentry{arg2@\texttt{arg2}|hyperpage}{xxii}
+\indexentry{a@\texttt  {a}|hyperpage}{xxiv}
+\indexentry{b@\texttt  {b}|hyperpage}{xxiv}
+\indexentry{a@\texttt  {a}|hyperpage}{xxvi}
+\indexentry{b@\texttt  {b}|hyperpage}{xxvi}
+\indexentry{machin@\texttt{machin}|hyperpage}{xxvi}
+\indexentry{machin@\texttt{machin}|hyperpage}{xxvi}
+\indexentry{machin@\texttt{machin}|hyperpage}{xxvi}
+\indexentry{machin@\texttt{machin}|hyperpage}{xxvi}
+\indexentry{followed@\texttt{followed}|hyperpage}{xxvi}
+\indexentry{after@\texttt{after}|hyperpage}{xxvii}
+\indexentry{invalid@\texttt{\GNUTexinfocommandstyletextvar{invalid}}|hyperpage}{xxvii}
+\indexentry{``@\texttt{{`}{`}}|hyperpage}{2}
+\indexentry{--foption@\texttt{{-}{-}foption}|hyperpage}{2}
+\indexentry{d--effn\_name@\texttt{d{-}{-}effn\_name}|hyperpage}{7}
+\indexentry{de--ffn\_name@\texttt{de{-}{-}ffn\_name}|hyperpage}{7}
+\indexentry{i@\texttt{\GNUTexinfocommandstyletextvar{i}}|hyperpage}{8}
+\indexentry{truc@\texttt{truc}|hyperpage}{8}
+\indexentry{log trap@\texttt{log trap}|hyperpage}{8}
+\indexentry{log trap1@\texttt{log trap1}|hyperpage}{8}
+\indexentry{log trap2@\texttt{log trap2}|hyperpage}{8}
+\indexentry{id ule@\texttt{\textbf{id ule}}|hyperpage}{8}
+\indexentry{id i ule@\texttt{\textbf{id `\texttt{i}'\ ule}}|hyperpage}{8}
+\indexentry{machin@\texttt{machin}|hyperpage}{8}
+\indexentry{bidule machin@\texttt{bidule machin}|hyperpage}{8}
+\indexentry{machin@\texttt{machin}|hyperpage}{8}
+\indexentry{followed@\texttt{followed}|hyperpage}{8}
+\indexentry{a@\texttt{a}|hyperpage}{8}
+\indexentry{deffnx@\texttt{deffnx}|hyperpage}{8}
+\indexentry{deffn@\texttt{deffn}|hyperpage}{8}
+\indexentry{deffn@\texttt{deffn}|hyperpage}{8}
+\indexentry{deffnx@\texttt{deffnx}|hyperpage}{8}
+\indexentry{i@\texttt{\GNUTexinfocommandstyletextvar{i}}|hyperpage}{8}
+\indexentry{truc@\texttt{truc}|hyperpage}{8}
+\indexentry{n--ame@\texttt{n{-}{-}ame}|hyperpage}{8}
+\indexentry{n--ame@\texttt{n{-}{-}ame}|hyperpage}{8}
+\indexentry{d--eftypefn\_name@\texttt{d{-}{-}eftypefn\_name}|hyperpage}{8}
+\indexentry{d--eftypefn\_name@\texttt{d{-}{-}eftypefn\_name}|hyperpage}{8}
+\indexentry{d--eftypeop\_name on c--lass@\texttt{d{-}{-}eftypeop\_name\ on 
c{-}{-}lass}|hyperpage}{8}
+\indexentry{d--eftypeop\_name on c--lass@\texttt{d{-}{-}eftypeop\_name\ on 
c{-}{-}lass}|hyperpage}{8}
+\indexentry{d--efop\_name on c--lass@\texttt{d{-}{-}efop\_name\ on 
c{-}{-}lass}|hyperpage}{9}
+\indexentry{d--efop\_name on c--lass@\texttt{d{-}{-}efop\_name\ on 
c{-}{-}lass}|hyperpage}{9}
+\indexentry{d--efun\_name@\texttt{d{-}{-}efun\_name}|hyperpage}{9}
+\indexentry{d--efmac\_name@\texttt{d{-}{-}efmac\_name}|hyperpage}{9}
+\indexentry{d--efspec\_name@\texttt{d{-}{-}efspec\_name}|hyperpage}{9}
+\indexentry{d--eftypefun\_name@\texttt{d{-}{-}eftypefun\_name}|hyperpage}{9}
+\indexentry{d--efmethod\_name on c--lass@\texttt{d{-}{-}efmethod\_name\ on 
c{-}{-}lass}|hyperpage}{10}
+\indexentry{d--eftypemethod\_name on 
c--lass@\texttt{d{-}{-}eftypemethod\_name\ on c{-}{-}lass}|hyperpage}{10}
+\indexentry{name2@\texttt{name2}|hyperpage}{10}
+\indexentry{d--eftypefn\_name2@\texttt{d{-}{-}eftypefn\_name2}|hyperpage}{10}
+\indexentry{d--eftypeop\_name2 on c--lass2@\texttt{d{-}{-}eftypeop\_name2\ on 
c{-}{-}lass2}|hyperpage}{10}
+\indexentry{d--eftypeop\_name2 on c--lass2@\texttt{d{-}{-}eftypeop\_name2\ on 
c{-}{-}lass2}|hyperpage}{10}
+\indexentry{arg2@\texttt{arg2}|hyperpage}{10}
+\indexentry{a@\texttt  {a}|hyperpage}{12}
+\indexentry{b@\texttt  {b}|hyperpage}{12}
+\indexentry{a@\texttt  {a}|hyperpage}{14}
+\indexentry{b@\texttt  {b}|hyperpage}{14}
+\indexentry{machin@\texttt{machin}|hyperpage}{14}
+\indexentry{machin@\texttt{machin}|hyperpage}{14}
+\indexentry{machin@\texttt{machin}|hyperpage}{14}
+\indexentry{machin@\texttt{machin}|hyperpage}{14}
+\indexentry{followed@\texttt{followed}|hyperpage}{14}
+\indexentry{after@\texttt{after}|hyperpage}{15}
+\indexentry{invalid@\texttt{\GNUTexinfocommandstyletextvar{invalid}}|hyperpage}{15}
+\indexentry{``@\texttt{{`}{`}}|hyperpage}{15}
+\indexentry{--foption@\texttt{{-}{-}foption}|hyperpage}{15}
+\indexentry{d--effn\_name@\texttt{d{-}{-}effn\_name}|hyperpage}{20}
+\indexentry{de--ffn\_name@\texttt{de{-}{-}ffn\_name}|hyperpage}{20}
+\indexentry{i@\texttt{\GNUTexinfocommandstyletextvar{i}}|hyperpage}{21}
+\indexentry{truc@\texttt{truc}|hyperpage}{21}
+\indexentry{log trap@\texttt{log trap}|hyperpage}{21}
+\indexentry{log trap1@\texttt{log trap1}|hyperpage}{21}
+\indexentry{log trap2@\texttt{log trap2}|hyperpage}{21}
+\indexentry{id ule@\texttt{\textbf{id ule}}|hyperpage}{21}
+\indexentry{id i ule@\texttt{\textbf{id `\texttt{i}'\ ule}}|hyperpage}{21}
+\indexentry{machin@\texttt{machin}|hyperpage}{21}
+\indexentry{bidule machin@\texttt{bidule machin}|hyperpage}{21}
+\indexentry{machin@\texttt{machin}|hyperpage}{21}
+\indexentry{followed@\texttt{followed}|hyperpage}{21}
+\indexentry{a@\texttt{a}|hyperpage}{21}
+\indexentry{deffnx@\texttt{deffnx}|hyperpage}{21}
+\indexentry{deffn@\texttt{deffn}|hyperpage}{21}
+\indexentry{deffn@\texttt{deffn}|hyperpage}{21}
+\indexentry{deffnx@\texttt{deffnx}|hyperpage}{21}
+\indexentry{i@\texttt{\GNUTexinfocommandstyletextvar{i}}|hyperpage}{21}
+\indexentry{truc@\texttt{truc}|hyperpage}{21}
+\indexentry{n--ame@\texttt{n{-}{-}ame}|hyperpage}{21}
+\indexentry{n--ame@\texttt{n{-}{-}ame}|hyperpage}{21}
+\indexentry{d--eftypefn\_name@\texttt{d{-}{-}eftypefn\_name}|hyperpage}{21}
+\indexentry{d--eftypefn\_name@\texttt{d{-}{-}eftypefn\_name}|hyperpage}{21}
+\indexentry{d--eftypeop\_name on c--lass@\texttt{d{-}{-}eftypeop\_name\ on 
c{-}{-}lass}|hyperpage}{21}
+\indexentry{d--eftypeop\_name on c--lass@\texttt{d{-}{-}eftypeop\_name\ on 
c{-}{-}lass}|hyperpage}{21}
+\indexentry{d--efop\_name on c--lass@\texttt{d{-}{-}efop\_name\ on 
c{-}{-}lass}|hyperpage}{22}
+\indexentry{d--efop\_name on c--lass@\texttt{d{-}{-}efop\_name\ on 
c{-}{-}lass}|hyperpage}{22}
+\indexentry{d--efun\_name@\texttt{d{-}{-}efun\_name}|hyperpage}{22}
+\indexentry{d--efmac\_name@\texttt{d{-}{-}efmac\_name}|hyperpage}{22}
+\indexentry{d--efspec\_name@\texttt{d{-}{-}efspec\_name}|hyperpage}{22}
+\indexentry{d--eftypefun\_name@\texttt{d{-}{-}eftypefun\_name}|hyperpage}{22}
+\indexentry{d--efmethod\_name on c--lass@\texttt{d{-}{-}efmethod\_name\ on 
c{-}{-}lass}|hyperpage}{23}
+\indexentry{d--eftypemethod\_name on 
c--lass@\texttt{d{-}{-}eftypemethod\_name\ on c{-}{-}lass}|hyperpage}{23}
+\indexentry{name2@\texttt{name2}|hyperpage}{23}
+\indexentry{d--eftypefn\_name2@\texttt{d{-}{-}eftypefn\_name2}|hyperpage}{23}
+\indexentry{d--eftypeop\_name2 on c--lass2@\texttt{d{-}{-}eftypeop\_name2\ on 
c{-}{-}lass2}|hyperpage}{23}
+\indexentry{d--eftypeop\_name2 on c--lass2@\texttt{d{-}{-}eftypeop\_name2\ on 
c{-}{-}lass2}|hyperpage}{23}
+\indexentry{arg2@\texttt{arg2}|hyperpage}{23}
+\indexentry{a@\texttt  {a}|hyperpage}{25}
+\indexentry{b@\texttt  {b}|hyperpage}{25}
+\indexentry{a@\texttt  {a}|hyperpage}{27}
+\indexentry{b@\texttt  {b}|hyperpage}{27}
+\indexentry{machin@\texttt{machin}|hyperpage}{27}
+\indexentry{machin@\texttt{machin}|hyperpage}{27}
+\indexentry{machin@\texttt{machin}|hyperpage}{27}
+\indexentry{machin@\texttt{machin}|hyperpage}{27}
+\indexentry{followed@\texttt{followed}|hyperpage}{27}
+\indexentry{after@\texttt{after}|hyperpage}{28}
+\indexentry{invalid@\texttt{\GNUTexinfocommandstyletextvar{invalid}}|hyperpage}{28}
+\indexentry{``@\texttt{{`}{`}}|hyperpage}{29}
+\indexentry{--foption@\texttt{{-}{-}foption}|hyperpage}{29}
+\indexentry{d--effn\_name@\texttt{d{-}{-}effn\_name}|hyperpage}{37}
+\indexentry{de--ffn\_name@\texttt{de{-}{-}ffn\_name}|hyperpage}{37}
+\indexentry{i@\texttt{\GNUTexinfocommandstyletextvar{i}}|hyperpage}{37}
+\indexentry{truc@\texttt{truc}|hyperpage}{37}
+\indexentry{log trap@\texttt{log trap}|hyperpage}{37}
+\indexentry{log trap1@\texttt{log trap1}|hyperpage}{37}
+\indexentry{log trap2@\texttt{log trap2}|hyperpage}{37}
+\indexentry{id ule@\texttt{\textbf{id ule}}|hyperpage}{37}
+\indexentry{id i ule@\texttt{\textbf{id `\texttt{i}'\ ule}}|hyperpage}{37}
+\indexentry{machin@\texttt{machin}|hyperpage}{37}
+\indexentry{bidule machin@\texttt{bidule machin}|hyperpage}{37}
+\indexentry{machin@\texttt{machin}|hyperpage}{37}
+\indexentry{followed@\texttt{followed}|hyperpage}{37}
+\indexentry{a@\texttt{a}|hyperpage}{37}
+\indexentry{deffnx@\texttt{deffnx}|hyperpage}{37}
+\indexentry{deffn@\texttt{deffn}|hyperpage}{37}
+\indexentry{deffn@\texttt{deffn}|hyperpage}{37}
+\indexentry{deffnx@\texttt{deffnx}|hyperpage}{37}
+\indexentry{i@\texttt{\GNUTexinfocommandstyletextvar{i}}|hyperpage}{37}
+\indexentry{truc@\texttt{truc}|hyperpage}{37}
+\indexentry{n--ame@\texttt{n{-}{-}ame}|hyperpage}{37}
+\indexentry{n--ame@\texttt{n{-}{-}ame}|hyperpage}{37}
+\indexentry{d--eftypefn\_name@\texttt{d{-}{-}eftypefn\_name}|hyperpage}{38}
+\indexentry{d--eftypefn\_name@\texttt{d{-}{-}eftypefn\_name}|hyperpage}{38}
+\indexentry{d--eftypeop\_name on c--lass@\texttt{d{-}{-}eftypeop\_name\ on 
c{-}{-}lass}|hyperpage}{38}
+\indexentry{d--eftypeop\_name on c--lass@\texttt{d{-}{-}eftypeop\_name\ on 
c{-}{-}lass}|hyperpage}{38}
+\indexentry{d--efop\_name on c--lass@\texttt{d{-}{-}efop\_name\ on 
c{-}{-}lass}|hyperpage}{38}
+\indexentry{d--efop\_name on c--lass@\texttt{d{-}{-}efop\_name\ on 
c{-}{-}lass}|hyperpage}{38}
+\indexentry{d--efun\_name@\texttt{d{-}{-}efun\_name}|hyperpage}{39}
+\indexentry{d--efmac\_name@\texttt{d{-}{-}efmac\_name}|hyperpage}{39}
+\indexentry{d--efspec\_name@\texttt{d{-}{-}efspec\_name}|hyperpage}{39}
+\indexentry{d--eftypefun\_name@\texttt{d{-}{-}eftypefun\_name}|hyperpage}{39}
+\indexentry{d--efmethod\_name on c--lass@\texttt{d{-}{-}efmethod\_name\ on 
c{-}{-}lass}|hyperpage}{39}
+\indexentry{d--eftypemethod\_name on 
c--lass@\texttt{d{-}{-}eftypemethod\_name\ on c{-}{-}lass}|hyperpage}{39}
+\indexentry{name2@\texttt{name2}|hyperpage}{40}
+\indexentry{d--eftypefn\_name2@\texttt{d{-}{-}eftypefn\_name2}|hyperpage}{40}
+\indexentry{d--eftypeop\_name2 on c--lass2@\texttt{d{-}{-}eftypeop\_name2\ on 
c{-}{-}lass2}|hyperpage}{40}
+\indexentry{d--eftypeop\_name2 on c--lass2@\texttt{d{-}{-}eftypeop\_name2\ on 
c{-}{-}lass2}|hyperpage}{40}
+\indexentry{arg2@\texttt{arg2}|hyperpage}{40}
+\indexentry{a@\texttt  {a}|hyperpage}{42}
+\indexentry{b@\texttt  {b}|hyperpage}{42}
+\indexentry{a@\texttt  {a}|hyperpage}{45}
+\indexentry{b@\texttt  {b}|hyperpage}{45}
+\indexentry{machin@\texttt{machin}|hyperpage}{45}
+\indexentry{machin@\texttt{machin}|hyperpage}{45}
+\indexentry{machin@\texttt{machin}|hyperpage}{45}
+\indexentry{machin@\texttt{machin}|hyperpage}{45}
+\indexentry{followed@\texttt{followed}|hyperpage}{45}
+\indexentry{after@\texttt{after}|hyperpage}{45}
+\indexentry{invalid@\texttt{\GNUTexinfocommandstyletextvar{invalid}}|hyperpage}{45}
+\indexentry{t--ruc@\texttt{t{-}{-}ruc}|hyperpage}{46}
+\indexentry{T--ruc@\texttt{T{-}{-}ruc}|hyperpage}{46}
+\indexentry{.@\texttt{.}|hyperpage}{46}
+\indexentry{?@\texttt{?}|hyperpage}{46}
+\indexentry{a@\texttt{a}|hyperpage}{46}
+\indexentry{f---aa@\texttt{f{-}{-}{-}aa}|hyperpage}{46}
+\indexentry{f---bb@\texttt{f{-}{-}{-}bb}!f---cc@\texttt{f{-}{-}{-}cc}|hyperpage}{46}
+\indexentry{f---ddd@\texttt{f{-}{-}{-}ddd}!f---eee@\texttt{f{-}{-}{-}eee}!ffff@\texttt{ffff}|hyperpage}{46}
+\indexentry{f--aaa@\texttt{f{-}{-}{-}aaa}|hyperindexformat{\see{f---bbb}}}{46}
+\indexentry{f--ddd@\texttt{f{-}{-}{-}ddd}|hyperindexformat{\seealso{f---ccc}}}{46}
+\indexentry{X---S@\texttt{xxx}!X---S1@\texttt{zzz}|hyperpage}{46}
+\indexentry{@\texttt{\hbox{}}|hyperpage}{46}
+\indexentry{f---ggg@\texttt{f{-}{-}{-}ggg}!f---hhh fjjj@\texttt{f{-}{-}{-}hhh 
fjjj}!f---kkk@\texttt{f{-}{-}{-}kkk}!f---lll@\texttt{f{-}{-}{-}lll}|hyperpage}{46}
+\indexentry{f--ddd@\texttt{f{-}{-}{-}ddd}|hyperindexformat{\seealso{f---ccc}}}{46}
diff --git a/tp/tests/fn.ilg b/tp/tests/fn.ilg
new file mode 100644
index 0000000000..6b4734c708
--- /dev/null
+++ b/tp/tests/fn.ilg
@@ -0,0 +1,11 @@
+This is makeindex, version 2.16 [TeX Live 2022] (kpathsea + Thai support).
+Scanning input file fn.idx....
+!! Input index error (file = fn.idx, line = 272):
+   -- Illegal null field.
+!! Input index error (file = fn.idx, line = 273):
+   -- Extra `!' at position 103 of first argument.
+done (272 entries accepted, 2 rejected).
+Sorting entries.....done (2308 comparisons).
+Generating output file fn.ind....done (137 lines written, 0 warnings).
+Output written in fn.ind.
+Transcript written in fn.ilg.
diff --git a/tp/tests/fn.ind b/tp/tests/fn.ind
new file mode 100644
index 0000000000..a32856322a
--- /dev/null
+++ b/tp/tests/fn.ind
@@ -0,0 +1,137 @@
+\begin{theindex}
+
+  \item \texttt{{-}{-}foption}, \hyperpage{i}, \hyperpage{xiv}, 
+               \hyperpage{2}, \hyperpage{15}, \hyperpage{29}
+  \item \texttt{.}, \hyperpage{46}
+  \item \texttt{?}, \hyperpage{46}
+  \item \texttt{{`}{`}}, \hyperpage{i}, \hyperpage{xiv}, \hyperpage{2}, 
+               \hyperpage{15}, \hyperpage{29}
+
+  \indexspace
+
+  \item \texttt  {a}, \hyperpage{xi}, \hyperpage{xiii}, 
+               \hyperpage{xxiv}, \hyperpage{xxvi}, \hyperpage{12}, 
+               \hyperpage{14}, \hyperpage{25}, \hyperpage{27}, 
+               \hyperpage{42}, \hyperpage{45}
+  \item \texttt{a}, \hyperpage{vii}, \hyperpage{xx}, \hyperpage{8}, 
+               \hyperpage{21}, \hyperpage{37}, \hyperpage{46}
+  \item \texttt{after}, \hyperpage{xiv}, \hyperpage{xxvii}, 
+               \hyperpage{15}, \hyperpage{28}, \hyperpage{45}
+  \item \texttt{arg2}, \hyperpage{ix}, \hyperpage{xxii}, \hyperpage{10}, 
+               \hyperpage{23}, \hyperpage{40}
+
+  \indexspace
+
+  \item \texttt  {b}, \hyperpage{xi}, \hyperpage{xiii}, 
+               \hyperpage{xxiv}, \hyperpage{xxvi}, \hyperpage{12}, 
+               \hyperpage{14}, \hyperpage{25}, \hyperpage{27}, 
+               \hyperpage{42}, \hyperpage{45}
+  \item \texttt{bidule machin}, \hyperpage{vii}, \hyperpage{xx}, 
+               \hyperpage{8}, \hyperpage{21}, \hyperpage{37}
+
+  \indexspace
+
+  \item \texttt{d{-}{-}effn\_name}, \hyperpage{vi}, \hyperpage{xix}, 
+               \hyperpage{7}, \hyperpage{20}, \hyperpage{37}
+  \item \texttt{d{-}{-}efmac\_name}, \hyperpage{viii}, \hyperpage{xxi}, 
+               \hyperpage{9}, \hyperpage{22}, \hyperpage{39}
+  \item \texttt{d{-}{-}efmethod\_name\ on c{-}{-}lass}, \hyperpage{ix}, 
+               \hyperpage{xxii}, \hyperpage{10}, \hyperpage{23}, 
+               \hyperpage{39}
+  \item \texttt{d{-}{-}efop\_name\ on c{-}{-}lass}, \hyperpage{viii}, 
+               \hyperpage{xxi}, \hyperpage{9}, \hyperpage{22}, 
+               \hyperpage{38}
+  \item \texttt{d{-}{-}efspec\_name}, \hyperpage{viii}, \hyperpage{xxi}, 
+               \hyperpage{9}, \hyperpage{22}, \hyperpage{39}
+  \item \texttt{d{-}{-}eftypefn\_name}, \hyperpage{vii}, \hyperpage{xx}, 
+               \hyperpage{8}, \hyperpage{21}, \hyperpage{38}
+  \item \texttt{d{-}{-}eftypefn\_name2}, \hyperpage{ix}, 
+               \hyperpage{xxii}, \hyperpage{10}, \hyperpage{23}, 
+               \hyperpage{40}
+  \item \texttt{d{-}{-}eftypefun\_name}, \hyperpage{viii}, 
+               \hyperpage{xxi}, \hyperpage{9}, \hyperpage{22}, 
+               \hyperpage{39}
+  \item \texttt{d{-}{-}eftypemethod\_name\ on c{-}{-}lass}, 
+               \hyperpage{ix}, \hyperpage{xxii}, \hyperpage{10}, 
+               \hyperpage{23}, \hyperpage{39}
+  \item \texttt{d{-}{-}eftypeop\_name\ on c{-}{-}lass}, \hyperpage{vii}, 
+               \hyperpage{xx}, \hyperpage{8}, \hyperpage{21}, 
+               \hyperpage{38}
+  \item \texttt{d{-}{-}eftypeop\_name2\ on c{-}{-}lass2}, 
+               \hyperpage{ix}, \hyperpage{xxii}, \hyperpage{10}, 
+               \hyperpage{23}, \hyperpage{40}
+  \item \texttt{d{-}{-}efun\_name}, \hyperpage{viii}, \hyperpage{xxi}, 
+               \hyperpage{9}, \hyperpage{22}, \hyperpage{39}
+  \item \texttt{de{-}{-}ffn\_name}, \hyperpage{vi}, \hyperpage{xix}, 
+               \hyperpage{7}, \hyperpage{20}, \hyperpage{37}
+  \item \texttt{deffn}, \hyperpage{vii}, \hyperpage{xx}, \hyperpage{8}, 
+               \hyperpage{21}, \hyperpage{37}
+  \item \texttt{deffnx}, \hyperpage{vii}, \hyperpage{xx}, \hyperpage{8}, 
+               \hyperpage{21}, \hyperpage{37}
+
+  \indexspace
+
+  \item \texttt{f{-}{-}{-}aa}, \hyperpage{46}
+  \item \texttt{f{-}{-}{-}bb}
+    \subitem \texttt{f{-}{-}{-}cc}, \hyperpage{46}
+  \item \texttt{f{-}{-}{-}ddd}
+    \subitem \texttt{f{-}{-}{-}eee}
+      \subsubitem \texttt{ffff}, \hyperpage{46}
+  \item \texttt{f{-}{-}{-}aaa}, \hyperindexformat{\see{f---bbb}}{46}
+  \item \texttt{f{-}{-}{-}ddd}, 
+               \hyperindexformat{\seealso{f---ccc}}{46}
+  \item \texttt{followed}, \hyperpage{vii}, \hyperpage{xiii}, 
+               \hyperpage{xx}, \hyperpage{xxvi}, \hyperpage{8}, 
+               \hyperpage{14}, \hyperpage{21}, \hyperpage{27}, 
+               \hyperpage{37}, \hyperpage{45}
+
+  \indexspace
+
+  \item \texttt{\GNUTexinfocommandstyletextvar{i}}, \hyperpage{vii}, 
+               \hyperpage{xx}, \hyperpage{8}, \hyperpage{21}, 
+               \hyperpage{37}
+  \item \texttt{\textbf{id `\texttt{i}'\ ule}}, \hyperpage{vii}, 
+               \hyperpage{xx}, \hyperpage{8}, \hyperpage{21}, 
+               \hyperpage{37}
+  \item \texttt{\textbf{id ule}}, \hyperpage{vii}, \hyperpage{xx}, 
+               \hyperpage{8}, \hyperpage{21}, \hyperpage{37}
+  \item \texttt{\GNUTexinfocommandstyletextvar{invalid}}, 
+               \hyperpage{xiv}, \hyperpage{xxvii}, \hyperpage{15}, 
+               \hyperpage{28}, \hyperpage{45}
+
+  \indexspace
+
+  \item \texttt{log trap}, \hyperpage{vii}, \hyperpage{xx}, 
+               \hyperpage{8}, \hyperpage{21}, \hyperpage{37}
+  \item \texttt{log trap1}, \hyperpage{vii}, \hyperpage{xx}, 
+               \hyperpage{8}, \hyperpage{21}, \hyperpage{37}
+  \item \texttt{log trap2}, \hyperpage{vii}, \hyperpage{xx}, 
+               \hyperpage{8}, \hyperpage{21}, \hyperpage{37}
+
+  \indexspace
+
+  \item \texttt{machin}, \hyperpage{vii}, \hyperpage{xiii}, 
+               \hyperpage{xx}, \hyperpage{xxvi}, \hyperpage{8}, 
+               \hyperpage{14}, \hyperpage{21}, \hyperpage{27}, 
+               \hyperpage{37}, \hyperpage{45}
+
+  \indexspace
+
+  \item \texttt{n{-}{-}ame}, \hyperpage{vii}, \hyperpage{xx}, 
+               \hyperpage{8}, \hyperpage{21}, \hyperpage{37}
+  \item \texttt{name2}, \hyperpage{ix}, \hyperpage{xxii}, 
+               \hyperpage{10}, \hyperpage{23}, \hyperpage{40}
+
+  \indexspace
+
+  \item \texttt{T{-}{-}ruc}, \hyperpage{46}
+  \item \texttt{t{-}{-}ruc}, \hyperpage{46}
+  \item \texttt{truc}, \hyperpage{vii}, \hyperpage{xx}, \hyperpage{8}, 
+               \hyperpage{21}, \hyperpage{37}
+
+  \indexspace
+
+  \item \texttt{xxx}
+    \subitem \texttt{zzz}, \hyperpage{46}
+
+\end{theindex}
diff --git a/tp/tests/formatting.aux b/tp/tests/formatting.aux
new file mode 100644
index 0000000000..2be1fb5481
--- /dev/null
+++ b/tp/tests/formatting.aux
@@ -0,0 +1,42 @@
+\relax 
+\providecommand\zref@newlabel[2]{}
+\providecommand\hyper@newdestlabel[2]{}
+\providecommand\HyperFirstAtBeginDocument{\AtBeginDocument}
+\HyperFirstAtBeginDocument{\ifx\hyper@anchor\@undefined
+\global\let\oldnewlabel\newlabel
+\gdef\newlabel#1#2{\newlabelxx{#1}#2}
+\gdef\newlabelxx#1#2#3#4#5#6{\oldnewlabel{#1}{{#2}{#3}}}
+\AtEndDocument{\ifx\hyper@anchor\@undefined
+\let\newlabel\oldnewlabel
+\fi}
+\fi}
+\global\let\hyper@last\relax 
+\gdef\HyperFirstAtBeginDocument#1{#1}
+\providecommand\HyField@AuxAddToFields[1]{}
+\providecommand\HyField@AuxAddToCoFields[2]{}
+\zref@newlabel{mdf@pagelabel-1}{\default{}\page{xi}\abspage{11}\mdf@pagevalue{11}}
+\pgfsyspdfmark {pgfid1}{7030046}{27700461}
+\zref@newlabel{mdf@pagelabel-2}{\default{}\page{xxiv}\abspage{24}\mdf@pagevalue{24}}
+\pgfsyspdfmark {pgfid2}{10568990}{27700461}
+\newlabel{anchor:Top}{{}{2}{\contentsname \@mkboth {\MakeUppercase 
\contentsname }{\MakeUppercase \contentsname }}{chapter*.11}{}}
+\@writefile{toc}{\contentsline {chapter}{\numberline 
{1}chapter}{2}{chapter.1}\protected@file@percent }
+\@writefile{lof}{\addvspace {10\p@ }}
+\@writefile{lot}{\addvspace {10\p@ }}
+\newlabel{anchor:chapter}{{1}{2}{chapter}{chapter.1}{}}
+\zref@newlabel{mdf@pagelabel-3}{\default{1}\page{12}\abspage{39}\mdf@pagevalue{12}}
+\pgfsyspdfmark {pgfid3}{10568990}{27700461}
+\zref@newlabel{mdf@pagelabel-4}{\default{1}\page{25}\abspage{52}\mdf@pagevalue{25}}
+\pgfsyspdfmark {pgfid4}{7030046}{27700461}
+\zref@newlabel{mdf@pagelabel-5}{\default{1}\page{42}\abspage{69}\mdf@pagevalue{42}}
+\pgfsyspdfmark {pgfid5}{10568990}{18069939}
+\@writefile{toc}{\contentsline {section}{\numberline {1.1}A 
section}{49}{section.1.1}\protected@file@percent }
+\newlabel{anchor:s_002d_002dect_002cion}{{1.1}{49}{A section}{section.1.1}{}}
+\@writefile{toc}{\contentsline {subsection}{\numberline 
{1.1.1}subsection}{49}{subsection.1.1.1}\protected@file@percent }
+\newlabel{anchor:subsection}{{1.1.1}{49}{subsection}{subsection.1.1.1}{}}
+\newlabel{anchor:anchor}{{1.1.1}{49}{subsection}{subsection.1.1.1}{}}
+\@writefile{toc}{\contentsline {subsubsection}{subsubsection 
``simple-double--}{49}{section*.30}\protected@file@percent }
+\newlabel{anchor:subsubsection-_0060_0060simple_002ddouble_002d_002d}{{1.1.1}{49}{subsubsection
 ``simple-double--}{section*.30}{}}
+\@writefile{toc}{\contentsline 
{subsubsection}{three---four----''}{49}{section*.31}\protected@file@percent }
+\newlabel{anchor:subsubsection-three_002d_002d_002dfour_002d_002d_002d_002d_0027_0027}{{1.1.1}{49}{three---four----''}{section*.31}{}}
+\newlabel{anchor:chapter2}{{1.1.1}{49}{\centering chapter 2}{chapter*.32}{}}
+\gdef \@abspage@last{77}
diff --git a/tp/tests/formatting.out b/tp/tests/formatting.out
new file mode 100644
index 0000000000..994f229510
--- /dev/null
+++ b/tp/tests/formatting.out
@@ -0,0 +1,3 @@
+\BOOKMARK [0][-]{chapter.1}{\376\377\000c\000h\000a\000p\000t\000e\000r}{}% 1
+\BOOKMARK 
[1][-]{section.1.1}{\376\377\000A\000\040\000s\000e\000c\000t\000i\000o\000n}{chapter.1}%
 2
+\BOOKMARK 
[2][-]{subsection.1.1.1}{\376\377\000s\000u\000b\000s\000e\000c\000t\000i\000o\000n}{section.1.1}%
 3
diff --git a/tp/tests/formatting.pdf b/tp/tests/formatting.pdf
new file mode 100644
index 0000000000..81263b6891
Binary files /dev/null and b/tp/tests/formatting.pdf differ
diff --git a/tp/tests/formatting.toc b/tp/tests/formatting.toc
new file mode 100644
index 0000000000..4d25fa0369
--- /dev/null
+++ b/tp/tests/formatting.toc
@@ -0,0 +1,5 @@
+\contentsline {chapter}{\numberline {1}chapter}{2}{chapter.1}%
+\contentsline {section}{\numberline {1.1}A section}{49}{section.1.1}%
+\contentsline {subsection}{\numberline 
{1.1.1}subsection}{49}{subsection.1.1.1}%
+\contentsline {subsubsection}{subsubsection 
``simple-double--}{49}{section*.30}%
+\contentsline {subsubsection}{three---four----''}{49}{section*.31}%
diff --git a/tp/tests/formatting/res_parser/cpp_lines/cpp_lines.2 
b/tp/tests/formatting/res_parser/cpp_lines/cpp_lines.2
index e493afa3e6..307af06e70 100644
--- a/tp/tests/formatting/res_parser/cpp_lines/cpp_lines.2
+++ b/tp/tests/formatting/res_parser/cpp_lines/cpp_lines.2
@@ -1,3 +1,5 @@
 g_f:74: @include: could not find file_with_cpp_lines.texi
+email12:64: @email missing closing brace
+email4:63: misplaced }
 accentêd:7: warning: làng is not a valid language code
 cpp_lines.texi: warning: must specify a title with a title command or @top
diff --git a/tp/tests/formatting/res_parser/cpp_lines/cpp_lines.html 
b/tp/tests/formatting/res_parser/cpp_lines/cpp_lines.html
index 8a00e1341e..46fb94143b 100644
--- a/tp/tests/formatting/res_parser/cpp_lines/cpp_lines.html
+++ b/tp/tests/formatting/res_parser/cpp_lines/cpp_lines.html
@@ -56,8 +56,37 @@ span.program-in-footer {font-size: smaller}
 </p>
 <p><a class="email" href="mailto:after%20verb";>after verb</a>
 </p>
+<p>a<a class="footnote" id="DOCF1" href="#FOOT1"><sup>1</sup></a>
+</p>
+<p>a<a class="footnote" id="DOCF2" href="#FOOT2"><sup>2</sup></a>
+</p>
+
+<p><a class="email" href="mailto:etext1";>etext2</a>
+</p>
+<p><a class="email" href="mailto:%20no%20line%20directive%20mail%20space";> no 
line directive text space</a>
+</p>
+<p><a class="email" href="mailto:%20mail%20space";> text space</a>
+</p>
+<p>etext3,
+</p>
+
+<p>etext4
+
+</p>
+
+
+
+
+<div class="footnotes-segment">
+<hr>
+<h3 class="footnotes-heading">Footnotes</h3>
 
+<h5 class="footnote-body-heading"><a id="FOOT1" href="#DOCF1">(1)</a></h5>
+<p>in footnote</p>
+<h5 class="footnote-body-heading"><a id="FOOT2" href="#DOCF2">(2)</a></h5>
 
+<p>in 2footnote</p>
+</div>
 <hr>
 <p>
   <span class="program-in-footer">This document was generated on <em 
class="emph">a sunny day</em> using <a class="uref" 
href="http://www.gnu.org/software/texinfo/";><em 
class="emph">texi2any</em></a>.</span>
diff --git a/tp/tests/test_texixml_and_back.sh 
b/tp/tests/test_texixml_and_back.sh
new file mode 100644
index 0000000000..0235039c05
--- /dev/null
+++ b/tp/tests/test_texixml_and_back.sh
@@ -0,0 +1,93 @@
+#! /bin/sh
+# Check macro expansion.  Verify that conversion to Texinfo XML and
+# back to Texinfo gives the same output
+# 
+# Copyright 2010-2019 Free Software Foundation, Inc.
+#
+# Copying and distribution of this file, with or without modification,
+# are permitted in any medium without royalty provided the copyright
+# notice and this notice are preserved.
+
+
+LC_ALL=C; export LC_ALL
+
+prepended_command=
+#prepended_command=time
+
+clean=no
+copy=no
+#mydir=
+
+while [ z"$1" = 'z-clean' -o z"$1" = 'z-copy' ]; do
+  if [ z"$1" = 'z-clean' ]; then
+    clean=yes
+    shift
+  fi
+
+  if [ z"$1" = 'z-copy' ]; then
+    copy=yes
+    shift
+  fi
+done
+
+
+if [ "z$testdir" = 'z' ]; then
+  testdir=.
+fi
+
+if [ "z$srcdir" = 'z' ]; then
+  srcdir=.
+fi
+
+. $testdir/../../defs || exit 1
+
+current=test_texixml_and_back
+test_name=$current
+
+one_test_logs_dir=$testdir/test_log
+
+  test -d $one_test_logs_dir || mkdir $one_test_logs_dir
+  logfile=$one_test_logs_dir/$test_name.log
+
+res_dir=res_parser
+out_dir=out_parser
+
+outdir="$testdir/${out_dir}/"
+results_dir="$srcdir/$testdir/${res_dir}"
+
+    dir=$current
+
+  resdir=$srcdir/$testdir/${res_dir}/
+  test -d "$resdir" || mkdir "$resdir"
+  echo "made result dir: $resdir" >>$logfile
+
+if [ "z$clean" = 'zyes' -o "z$copy" = 'zyes' ]; then
+    if [ "z$clean" = 'zyes' ]; then
+        [ -d "${outdir}$dir" ] && rm -rf "${outdir}$dir"
+    else
+        if [ -d "${outdir}$dir" ]; then
+          mkdir -p "${resdir}$dir/"
+          rm -rf "${resdir}$dir/"*
+          cp -r "${outdir}$dir/"* "${resdir}$dir/"
+        else
+          echo "$0: No dir ${outdir}$dir" >&2
+          exit 1
+        fi
+   fi
+   exit 0
+fi
+
+# from run_parser_all.sh
+main_command='texi2any.pl'
+command=$main_command
+    for command_location_dir in "$srcdir/../" "$srcdir/../../" 
$testdir/../../; do
+      if [ -f "$command_location_dir/$command" ]; then
+        command_run="$command_location_dir/$command"
+        break
+      fi
+    done
+
+    test -d "${outdir}$dir" && rm -rf "${outdir}$dir"
+    mkdir "${outdir}$dir"
+
+
diff --git a/tp/tests/tp.idx b/tp/tests/tp.idx
new file mode 100644
index 0000000000..b1067adb14
--- /dev/null
+++ b/tp/tests/tp.idx
@@ -0,0 +1,5 @@
+\indexentry{d--eftp\_name@\texttt{d{-}{-}eftp\_name}|hyperpage}{viii}
+\indexentry{d--eftp\_name@\texttt{d{-}{-}eftp\_name}|hyperpage}{xxi}
+\indexentry{d--eftp\_name@\texttt{d{-}{-}eftp\_name}|hyperpage}{9}
+\indexentry{d--eftp\_name@\texttt{d{-}{-}eftp\_name}|hyperpage}{22}
+\indexentry{d--eftp\_name@\texttt{d{-}{-}eftp\_name}|hyperpage}{38}
diff --git a/tp/tests/tp.ilg b/tp/tests/tp.ilg
new file mode 100644
index 0000000000..46c052a1f7
--- /dev/null
+++ b/tp/tests/tp.ilg
@@ -0,0 +1,6 @@
+This is makeindex, version 2.16 [TeX Live 2022] (kpathsea + Thai support).
+Scanning input file tp.idx....done (5 entries accepted, 0 rejected).
+Sorting entries....done (11 comparisons).
+Generating output file tp.ind....done (6 lines written, 0 warnings).
+Output written in tp.ind.
+Transcript written in tp.ilg.
diff --git a/tp/tests/tp.ind b/tp/tests/tp.ind
new file mode 100644
index 0000000000..4f4c5b8312
--- /dev/null
+++ b/tp/tests/tp.ind
@@ -0,0 +1,6 @@
+\begin{theindex}
+
+  \item \texttt{d{-}{-}eftp\_name}, \hyperpage{viii}, \hyperpage{xxi}, 
+               \hyperpage{9}, \hyperpage{22}, \hyperpage{38}
+
+\end{theindex}
diff --git a/tp/tests/truc.idx b/tp/tests/truc.idx
new file mode 100644
index 0000000000..e69de29bb2
diff --git a/tp/tests/truc.ilg b/tp/tests/truc.ilg
new file mode 100644
index 0000000000..c662ecb389
--- /dev/null
+++ b/tp/tests/truc.ilg
@@ -0,0 +1,4 @@
+This is makeindex, version 2.16 [TeX Live 2022] (kpathsea + Thai support).
+Scanning input file truc.idx...done (0 entries accepted, 0 rejected).
+Nothing written in truc.ind.
+Transcript written in truc.ilg.
diff --git a/tp/tests/truc.ind b/tp/tests/truc.ind
new file mode 100644
index 0000000000..e69de29bb2



reply via email to

[Prev in Thread] Current Thread [Next in Thread]