gbranden pushed a commit to branch master
in repository groff.

commit ee2011b6c921b3e04ebb5b7d58383049cdd75a04
Author: G. Branden Robinson <[email protected]>
AuthorDate: Thu Sep 18 03:40:15 2025 -0500

    tmac/fallbacks.tmac: Fix Savannah #66653.
    
    * tmac/fallbacks.tmac: Define different fallbacks for accented
      non-Latin-1 Latin characters, using one ordering for nroff-mode
      devices and another for troff-mode devices.  We assume that the former
      can't constructively overstrike and the latter can.
    
      On troff-mode devices, it can make sense to use the `asciify` request
      to serialize special characters in device extension commands, and in
      that case we want to write the base glyph before any combining ones.
    
      On non-constructively overstriking devices, the last character written
      at the drawing position "wins"; we want that to be the base glyph.
    
    Fixes <https://savannah.gnu.org/bugs/?66653>.  Thanks to Deri James for
    pushing device extension commands to the limit, exposing this defect.
---
 ChangeLog           |  20 ++++++
 tmac/fallbacks.tmac | 187 ++++++++++++++++++++++++++++++++++++----------------
 2 files changed, 152 insertions(+), 55 deletions(-)

diff --git a/ChangeLog b/ChangeLog
index 5ae9b810f..c423e395c 100644
--- a/ChangeLog
+++ b/ChangeLog
@@ -1,3 +1,23 @@
+2025-09-18  G. Branden Robinson <[email protected]>
+
+       * tmac/fallbacks.tmac: Define different fallbacks for accented
+       non-Latin-1 Latin characters, using one ordering for nroff-mode
+       devices and another for troff-mode devices.  We assume that the
+       former can't constructively overstrike and the latter can.
+
+       On troff-mode devices, it can make sense to use the `asciify`
+       request to serialize special characters in device extension
+       commands, and in that case we want to write the base glyph
+       before any combining ones.
+
+       On non-constructively overstriking devices, the last character
+       written at the drawing position "wins"; we want that to be the
+       base glyph.
+
+       Fixes <https://savannah.gnu.org/bugs/?66653>.  Thanks to Deri
+       James for pushing device extension commands to the limit,
+       exposing this defect.
+
 2025-09-18  G. Branden Robinson <[email protected]>
 
        [troff]: Regression-test Savannah #66653.
diff --git a/tmac/fallbacks.tmac b/tmac/fallbacks.tmac
index 0862092f5..43cb595cf 100644
--- a/tmac/fallbacks.tmac
+++ b/tmac/fallbacks.tmac
@@ -85,69 +85,146 @@
 .\" because dotting an I (or not) results in a different base glyph.
 .\" In any case, dotless 'i' base glyphs are rare in old fonts.
 .\"
+.\" We use separate fallbacks for nroff-mode and troff-mode devices
+.\" because we assume that the former can't constructively overstrike
+.\" and the latter can.
+.\"
+.\" On troff-mode devices, it can make sense to use the `asciify`
+.\" request to serialize special characters in device extension
+.\" commands, and in that case we want to write the base glyph before
+.\" any combining ones.
+.\"
+.\" On non-constructively overstriking devices, the last character
+.\" written at the drawing position "wins"; we want that to be the base
+.\" glyph.
+.\"
 .\" Latin-2 fallbacks
-.fchar \[A ab] \z\[ab]A
-.fchar \[A ho] \z\[ho]A
-.fchar \[C aa] \z\[aa]C
-.fchar \[C ah] \z\[ah]C
-.fchar \[D ah] \z\[ah]D
-.fchar \[u0110] \z-D\" capital letter d with stroke
-.fchar \[E ah] \z\[ah]E
-.fchar \[E ho] \z\[ho]E
-.fchar \[/L]   \z/L
-.fchar \[L aa] \z\[aa]L
-.fchar \[L ho] \z\[ho]L
-.fchar \[N aa] \z\[aa]N
-.fchar \[N ah] \z\[ah]N
-.fchar \[O a"] \z\[a"]O
-.fchar \[R aa] \z\[aa]R
-.fchar \[R ah] \z\[ah]R
-.fchar \[S aa] \z\[aa]S
-.fchar \[S ac] \z\[ac]S
-.fchar \[vS]   \z\[ah]S
-.fchar \[T ac] \z\[ac]T
-.fchar \[T ah] \z\[ah]T
-.fchar \[U ao] \z\[ao]U
-.fchar \[U a"] \z\[a"]U
-.fchar \[Z aa] \z\[aa]Z
-.fchar \[Z a.] \z\[a.]Z
-.fchar \[vZ]   \z\[ah]Z
+.ie n \{\
+.  fchar \[A ab] \z\[ab]A
+.  fchar \[A ho] \z\[ho]A
+.  fchar \[C aa] \z\[aa]C
+.  fchar \[C ah] \z\[ah]C
+.  fchar \[D ah] \z\[ah]D
+.  fchar \[u0110] \z-D\" capital letter d with stroke
+.  fchar \[E ah] \z\[ah]E
+.  fchar \[E ho] \z\[ho]E
+.  fchar \[/L]   \z/L
+.  fchar \[L aa] \z\[aa]L
+.  fchar \[L ho] \z\[ho]L
+.  fchar \[N aa] \z\[aa]N
+.  fchar \[N ah] \z\[ah]N
+.  fchar \[O a"] \z\[a"]O
+.  fchar \[R aa] \z\[aa]R
+.  fchar \[R ah] \z\[ah]R
+.  fchar \[S aa] \z\[aa]S
+.  fchar \[S ac] \z\[ac]S
+.  fchar \[vS]   \z\[ah]S
+.  fchar \[T ac] \z\[ac]T
+.  fchar \[T ah] \z\[ah]T
+.  fchar \[U ao] \z\[ao]U
+.  fchar \[U a"] \z\[a"]U
+.  fchar \[Z aa] \z\[aa]Z
+.  fchar \[Z a.] \z\[a.]Z
+.  fchar \[vZ]   \z\[ah]Z
+.
+.  fchar \[a ab] \z\[ab]a
+.  fchar \[a ho] \z\[ho]a
+.  fchar \[c aa] \z\[aa]c
+.  fchar \[c ah] \z\[ah]c
+.  fchar \[d ah] \z\[ah]d
+.  fchar \[u0111] \z-d\" small letter d with stroke
+.  fchar \[e ah] \z\[ah]e
+.  fchar \[e ho] \z\[ho]e
+.  fchar \[/l]   \z/l
+.  fchar \[l aa] \z\[aa]l
+.  fchar \[l ho] \z\[ho]l
+.  fchar \[n aa] \z\[aa]n
+.  fchar \[n ah] \z\[ah]n
+.  fchar \[o a"] \z\[a"]o
+.  fchar \[r aa] \z\[aa]r
+.  fchar \[r ah] \z\[ah]r
+.  fchar \[s aa] \z\[aa]s
+.  fchar \[s ac] \z\[ac]s
+.  fchar \[vs]   \z\[ah]s
+.  fchar \[t ac] \z\[ac]t
+.  fchar \[t ah] \z\[ah]t
+.  fchar \[u ao] \z\[ao]u
+.  fchar \[u a"] \z\[a"]u
+.  fchar \[z aa] \z\[aa]z
+.  fchar \[z a.] \z\[a.]z
+.  fchar \[vz]   \z\[ah]z
+.\}
+.el \{\
+.  fchar \[A ab] \zA\[ab]
+.  fchar \[A ho] \zA\[ho]
+.  fchar \[C aa] \zC\[aa]
+.  fchar \[C ah] \zC\[ah]
+.  fchar \[D ah] \zD\[ah]
+.  fchar \[u0110] \zD-\" capital letter d with stroke
+.  fchar \[E ah] \zE\[ah]
+.  fchar \[E ho] \zE\[ho]
+.  fchar \[/L]   \zL/
+.  fchar \[L aa] \zL\[aa]
+.  fchar \[L ho] \zL\[ho]
+.  fchar \[N aa] \zN\[aa]
+.  fchar \[N ah] \zN\[ah]
+.  fchar \[O a"] \zO\[a"]
+.  fchar \[R aa] \zR\[aa]
+.  fchar \[R ah] \zR\[ah]
+.  fchar \[S aa] \zS\[aa]
+.  fchar \[S ac] \zS\[ac]
+.  fchar \[vS]   \zS\[ah]
+.  fchar \[T ac] \zT\[ac]
+.  fchar \[T ah] \zT\[ah]
+.  fchar \[U ao] \zU\[ao]
+.  fchar \[U a"] \zU\[a"]
+.  fchar \[Z aa] \zZ\[aa]
+.  fchar \[Z a.] \zZ\[a.]
+.  fchar \[vZ]   \zZ\[ah]
 .
-.fchar \[a ab] \z\[ab]a
-.fchar \[a ho] \z\[ho]a
-.fchar \[c aa] \z\[aa]c
-.fchar \[c ah] \z\[ah]c
-.fchar \[d ah] \z\[ah]d
-.fchar \[u0111] \z-d\" small letter d with stroke
-.fchar \[e ah] \z\[ah]e
-.fchar \[e ho] \z\[ho]e
-.fchar \[/l]   \z/l
-.fchar \[l aa] \z\[aa]l
-.fchar \[l ho] \z\[ho]l
-.fchar \[n aa] \z\[aa]n
-.fchar \[n ah] \z\[ah]n
-.fchar \[o a"] \z\[a"]o
-.fchar \[r aa] \z\[aa]r
-.fchar \[r ah] \z\[ah]r
-.fchar \[s aa] \z\[aa]s
-.fchar \[s ac] \z\[ac]s
-.fchar \[vs]   \z\[ah]s
-.fchar \[t ac] \z\[ac]t
-.fchar \[t ah] \z\[ah]t
-.fchar \[u ao] \z\[ao]u
-.fchar \[u a"] \z\[a"]u
-.fchar \[z aa] \z\[aa]z
-.fchar \[z a.] \z\[a.]z
-.fchar \[vz]   \z\[ah]z
+.  fchar \[a ab] \za\[ab]
+.  fchar \[a ho] \za\[ho]
+.  fchar \[c aa] \zc\[aa]
+.  fchar \[c ah] \zc\[ah]
+.  fchar \[d ah] \zd\[ah]
+.  fchar \[u0111] \zd-\" small letter d with stroke
+.  fchar \[e ah] \ze\[ah]
+.  fchar \[e ho] \ze\[ho]
+.  fchar \[/l]   \zl/
+.  fchar \[l aa] \zl\[aa]
+.  fchar \[l ho] \zl\[ho]
+.  fchar \[n aa] \zn\[aa]
+.  fchar \[n ah] \zn\[ah]
+.  fchar \[o a"] \zo\[a"]
+.  fchar \[r aa] \zr\[aa]
+.  fchar \[r ah] \zr\[ah]
+.  fchar \[s aa] \zs\[aa]
+.  fchar \[s ac] \zs\[ac]
+.  fchar \[vs]   \zs\[ah]
+.  fchar \[t ac] \zt\[ac]
+.  fchar \[t ah] \zt\[ah]
+.  fchar \[u ao] \zu\[ao]
+.  fchar \[u a"] \zu\[a"]
+.  fchar \[z aa] \zz\[aa]
+.  fchar \[z a.] \zz\[a.]
+.  fchar \[vz]   \zz\[ah]
+.\}
 .
 .\" Latin-5 fallbacks
-.fchar \[G ab] \z\[ab]G
-.fchar \[g ab] \z\[ab]g
+.ie n \{\
+.  fchar \[G ab] \z\[ab]G
+.  fchar \[g ab] \z\[ab]g
+.\}
+.el \{\
+.  fchar \[G ab] \zG\[ab]
+.  fchar \[g ab] \zg\[ab]
+.\}
 .
 .\" Latin-9 fallbacks
 .fchar \[OE] OE
 .fchar \[oe] oe
-.fchar \[:Y] \z\[ad]Y
+.ie n .fchar \[:Y] \z\[ad]Y
+.el   .fchar \[:Y] \zY\[ad]
 .
 .fchar \[u2000] \[u2002]\" en quad
 .fchar \[u2001] \[u2003]\" em quad

_______________________________________________
groff-commit mailing list
[email protected]
https://lists.gnu.org/mailman/listinfo/groff-commit

Reply via email to