bugGNU troff - Bugs: bug #57524, gpinyin: bad rendering for...


bug #57524: gpinyin: bad rendering for "ü" and "Ü" with tone marks

Submitted by:  Dave <barx>
Submitted on:  Fri 03 Jan 2020 12:07:01 AM UTC  
Category:  Preprocessor - others Severity:  3 - Normal
Item Group:  None Status:  In Progress
Privacy:  Public Assigned to:  G. Branden Robinson <gbranden>
Open/Closed:  Open Planned Release:  None

Add a New Comment (Rich Markup)

You are not logged in

Please log in, so followups can be emailed to you.


Mon 10 May 2021 01:31:20 PM UTC, comment #3: 

commit a475f646d1458025666ac8aeedbd43ddb2017635
Author: G. Branden Robinson <g.branden.robinson@gmail.com>
Date:   Mon May 10 06:55:55 2021 +1000

    [gpinyin]: Fix erroneous case folding of "Ü".

    * contrib/gpinyin/subs.pl (vowel_t): Fix incorrect rendering of base
      glyph 'U', which was being forced to lowercase when a dieresis and
      tone mark were both being applied.  This caused the tone mark to
      overlap the dieresis, so decrease the font size of the base glyph even
      more to compensate.  The result is ugly but comprehensible.

    See <https://savannah.gnu.org/bugs/?57524>, partially mitigated but not
    completely resolved.

G. Branden Robinson <gbranden>
Project AdministratorIn charge of this item.
Sun 09 May 2021 07:41:48 PM UTC, comment #2: 

Generalized summary.  The problem isn't with any specific syllable, but for the u-with-dieresis vowel in general.

Further, the problem with the capital U-with-dieresis is worse than suboptimal--a flat-wrong base glyph is rendered, and even if you correct that the tone mark and dieresis collide to the point of unreadability.

The good news?

Typographically, I have a solution.  An example document is below.  I used gpinyin to generate it (after applying the patch in comment #1) and then hand-tuned it.  Blissfully, a pretty straightforward technique of using vertical motions to place the tone marks worked fine.  The vertical motions are different for uppercase and lowercase base glyphs, however.  Serendipitously, one is half of the other.

A complication arose: groff doesn't allow us to nest a \v vertical motion escape inside a \o overstriking sequence escape.[1]

troff: <standard input>:16: error: normal or special character expected (got a node)

However, groff does let us cheat: by defining our own special characters that embed vertical motions, we can sneak them in anyway.

So that's what I did.  As can be seen, the character definitions are highly schematic.  I reckon the fix here is to make gpinyin inject these .char definitions into the troff mode branch of its output, use them where necessary, and subsequently delete them with .rchar.

Here's the input document.  I'm attaching a screenshot as well.

.ta T 1i
.char \[a-_uc] \v'-0.3v'\[a-]\v'+0.3v'
.char \[a-_lc] \v'-0.15v'\[a-]\v'+0.15v'
.char \[aa_uc] \v'-0.3v'\[aa]\v'+0.3v'
.char \[aa_lc] \v'-0.15v'\[aa]\v'+0.15v'
.char \[ah_uc] \v'-0.3v'\[ah]\v'+0.3v'
.char \[ah_lc] \v'-0.15v'\[ah]\v'+0.15v'
.char \[ga_uc] \v'-0.3v'\[ga]\v'+0.3v'
.char \[ga_lc] \v'-0.15v'\[ga]\v'+0.15v'
GBR     BW
L\o'\[:U]\[a-_uc]' l\o'\[:u]\[a-_lc]'   L\o'\s-2\[:U]\s0\[a-]' l\o'\s-2\[:u]\s0\[a-]'
L\o'\[:U]\[aa_uc]' l\o'\[:u]\[aa_lc]'   L\o'\s-2\[:U]\s0\[aa]' l\o'\s-2\[:u]\s0\[aa]'
L\o'\[:U]\[ah_uc]' l\o'\[:u]\[ah_lc]'   L\o'\s-2\[:U]\s0\[ah]' l\o'\s-2\[:u]\s0\[ah]'
L\o'\[:U]\[ga_uc]' l\o'\[:u]\[ga_lc]'   L\o'\s-2\[:U]\s0\[ga]' l\o'\s-2\[:u]\s0\[ga]'
BW:     Zu\['o]ti\o'a\[a-]'n w\o'o\[ah]' b\o'a\[a-]'ng n\o'\s-2\[:u]\s0\[ah]'\['e]r q\[`u] y\o'\[.i]\[a-]' ji\o'a\[a-]' cha\o'o\[a-]'sh\[`i] ma\o'\[.i]\[ah]' k\o'e\[ah]'l\[`e],
GBR:    Zu\['o]ti\o'a\[a-]'n w\o'o\[ah]' b\o'a\[a-]'ng n\o'\[:u]\[ah_lc]'\['e]r q\[`u] y\o'\[.i]\[a-]' ji\o'a\[a-]' cha\o'o\[a-]'sh\[`i] ma\o'\[.i]\[ah]' k\o'e\[ah]'l\[`e],

[1] I haven't checked if this is a limitation of Heirloom Doctools troff, and I have no way to check typesetter output on Version 7 Unix (with a mild effort I can check nroff output on the same platform), but that's utterly inapplicable here.  AT&T *roff can't be trusted to emit diagnostics.

G. Branden Robinson <gbranden>
Project AdministratorIn charge of this item.
Sun 09 May 2021 07:53:53 AM UTC, comment #1: 

Bernd also case-folded the U dieresis down, always, while he was at it.

You know, I'm not even going to file a separate bug for this.

Here's my fix for that part of the problem.  Apologies if the Perl isn't idiomatic; the only defense I can make for it is that I actually tested it.

I've never spent a lot of time in Perl.

This code base does not encourage me to start.

diff --git a/contrib/gpinyin/subs.pl b/contrib/gpinyin/subs.pl
index eda087bd..9eb1ed7c 100755
--- a/contrib/gpinyin/subs.pl
+++ b/contrib/gpinyin/subs.pl
@@ -525,8 +525,13 @@ sub vowel_t {      # named glyphs for troff

   # \o'\s-2\[:u]\s0\[a-]'
   if ( $vowel =~ /[üÜ]/ ) {
+    if ($vowel eq 'ü') {
+      $ue = q(\\[:u]);
+    } else {
+      $ue = q(\\[:U]);
+    }
     my $smaller = 2;
-    $vowel = q(\\o'\\s-) . $smaller . q(\\[:u]\\s0) .
+    $vowel = q(\\o'\\s-) . $smaller . $ue . q(\\s0) .
       $accents[$tone] . q(');
     return $vowel;

G. Branden Robinson <gbranden>
Project AdministratorIn charge of this item.
Fri 03 Jan 2020 12:07:01 AM UTC, original submission:  

Originally reported on the email list:


The recommended change is "to move the tone mark higher, instead of reducing the size of the base character."

Werner Lemberg's followup post said "I suggest to open a bug report so that it won't be forgotten...", so that's what this is.

Dave <barx>
Project Member


(Note: upload size limit is set to 16384 kB, after insertion of the required escape characters.)

Attach Files:

Attached Files


Depends on the following items: None found

Items that depend on this one: None found


Carbon-Copy List
  • -email is unavailable- added by gbranden (Posted a comment)

    Do you think this task is very important?
    If so, you can add your encouragement to it.
    This task has 0 encouragements so far.

    Only logged-in users can vote.




    Follow 5 latest changes.

    Date Changed by Updated Field Previous Value => Replaced by
    2021-05-09 gbranden Attached File- => Added pinyin_bernd_vs_branden.png, #51407
        StatusNone => In Progress
        Assigned toNone => gbranden
        Summarygpinyin: suboptimal rendering for syllable "lue3" => gpinyin: bad rendering for "ü" and "Ü" with tone marks
    2020-08-06 barx Carbon-CopyRemoved 93119 => -

    Back to the top

    Powered by Savane 3.6