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