[luatex] A bug in show_context second line indentation

user202729 at protonmail.com user202729 at protonmail.com
Sun Sep 29 08:22:28 CEST 2024


In the original TeX program, the `tally` variable is increased whenever `print_char` is called (except when character `s` is newline), regardless of `selector`.

However, in `tprint` function of LuaTeX, `tally` is only called when `selector` is `pseudo`.
This leads to incorrect indentation of the second line, for example the following TeX file

```tex
\errorcontextlines=10000
\def\c{1 \errorerror 2}
\def\b #1 {7 #1 8}
\def\a{5 \b {3 \c 4} 6}
\hbox{7 \a 8}
\stop
```

would lead to the following error (observe that the `<argument>` line is wrong):

```
\c ->1 \errorerror 
                   2
<argument> 3 \c 
     4
\b #1 ->7 #1
             8
\a ->5 \b {3 \c 4} 
                   6
l.5 \hbox{7 \a
             8}
```

I have two ideas how to fix it.

One is to add `strlen(sss)` to `tally` regardless.

The other is the following. This would still be incorrect if `selector` is `no_print` or `term_only`, however I think these cases will not happen.

```diff
diff --git a/source/texk/web2c/luatexdir/tex/printing.c b/source/texk/web2c/luatexdir/tex/printing.c
index 8a52700..b628280 100644
--- a/source/texk/web2c/luatexdir/tex/printing.c
+++ b/source/texk/web2c/luatexdir/tex/printing.c
@@ -498,6 +498,7 @@ void tprint(const char *sss)
                         t_flush_buffer(log_file,file_offset);
                     }
                 }
+                tally++;
             }
             if (*buffer) {
                 buffer[i++] = '\0';
```

I'm not sure which option is faster (on one hand the `strlen()` option need a separate loop, on the other hand it's a built-in library function so it should be fast?)
Regardless, if performance doesn't matter that much, I think `strlen()` option is better.

------

On an academical note, there is still a small difference between LuaTeX and PDFTeX with the following patch. With the following TeX code

```tex
\errorcontextlines=10000
\newlinechar=`u
\def\c{1 \errorerror 2}
\def\b #1 {7 #1 8}
\def\a{5 \b {3 \c 4} 6}
\hbox{7 \a 8}
\stop
```

then the output of LuaTeX would contains

```
<arg
ment> 3 \c 
                4
```
with 16 spaces before `4`, while PDFTeX only has 15 spaces before `4`.

In practice, chances are nobody cares. For performance reason it's fine to ignore this case.



More information about the luatex mailing list.