[prev in list] [next in list] [prev in thread] [next in thread] 

List:       lilypond-devel
Subject:    Re: ANN: Pygments support for LilyPond
From:       Jean Abou Samra <jean () abou-samra ! fr>
Date:       2021-11-27 23:04:35
Message-ID: e60d3545-4f88-3d10-82c3-dcb8cc0bb1cf () abou-samra ! fr
[Download RAW message or body]



Le 27/11/2021 à 23:02, Jean Abou Samra a écrit :
> [Sorry for Werner who will receive this email
> twice, I initially sent it from an address that
> is not subscribed to the list.]
>
>
> Le 27/11/2021 à 17:36, Jean Abou Samra a écrit :
>> Excerpt from an email that became private more or
>> less by accident (I've asked Werner):
>>
>>
>>>>> Anyway, as far as I know the package cfr-lm does provide LatinModern
>>>>> monowidth typewriter italic, bold and bold italic.
>>>>>
>>>>> https://ctan.org/pkg/cfr-lm
>>> Yes, it does.  However, there is no need to look at this package; the
>>> fonts in question are from the 'lm' family, and there is no additional
>>> value in 'cfr-lm' for the task at hand.
>>>
>>> It is non-trivial to set 'lm' up for texinfo.  Main reason is that
>>> there is no 'OT1' font encoding (and its siblings for 'OT1TT' and
>>> 'OT1OT' for typewriter and italic, respectively) available – texinfo
>>> is*not*  suited to 'T1' encoding in general.  It would thus be
>>> necessary to set up virtual fonts (`.vf`) together with its metrics
>>> files (`.tfm`), and those files had to be distributed with LilyPond.
>>> Using CTAN's `fontinst` package it is not very complicated to create
>>> such VFs, but we would also need to add proper CMap support to make
>>> copy-and-paste work in PDFs.  As you can see, there is*a lot* of
>>> things to do.
>>>
>>> Of course, you could argue that we only need to have fonts for the
>>> `@example` environment.  However, due to page breaking (which adds
>>> page headers and footers and takes care of footnotes), I'm not sure
>>> whether we could completely replace the fonts without interfering with
>>> texinfo's output routines, which switches fonts forth and back.
>>>
>>> Life would be much easier if we would drop pdfTeX support, using XeTeX
>>> or luatex only.  We could then directly use the OpenType font version
>>> of 'lm', for example.  However, I favor generic solutions for all
>>> three TeX engines.
>>
>> ---------------------------
>>
>>
>> I tried this solution, and I am experiencing a few
>> problems. For one thing, Firefox doesn't render the
>> bold typewriter fonts as bold (this is not happening
>> in your pygments.pdf, but, for reasons I don't understand,
>> it happens with the doc build). Also, when extractpdfmark
>> is used and the TeX engine is XeTeX, GhostScript gives
>> errors:
>>
>> Making Documentation/out-www/en/changes.pdf < texi
>>    **** Error: File did not complete the page properly and may be 
>> damaged.
>>                Output may be incorrect.
>>    **** Error: File did not complete the page properly and may be 
>> damaged.
>>                Output may be incorrect.
>>    **** Error: File did not complete the page properly and may be 
>> damaged.
>>                Output may be incorrect.
>>    **** Error: File did not complete the page properly and may be 
>> damaged.
>>                Output may be incorrect.
>>
>> In this case, even Evince doesn't render the bold.
>> See the attached PDFs, without-extractpdfmark.pdf and
>> after-extractpdfmark-and-gs.pdf. (You'll find the
>> extractpdfmark and gs invocations in Documentation/GNUmakefile.)
>> The only difference is in the invocation, either
>> 'make -C Documentation out=www out-www/en/changes.pdf' or
>> 'make -C Documentation out=www USE_EXTRACTPDFMARK=no 
>> out-www/en/changes.pdf'.
>> (In my environment, XeTeX is being used by default.)
>>
>> Also, the bold text looks a bit 'hirsute' when zomming out
>> in Evince. I guess that's the hinting issue you mentioned.
>> I tried to reduce the boldness by changing the value 0.2
>> in common-macros.itexi but it didn't have an effect -- I
>> wonder what's going on.
>>
>> Any ideas? You can reproduce all this by checking out
>> my branch (if you visit the merge request, GitLab
>> gives you command-line instructions in 'Check out branch').
>>
>> Thanks,
>> Jean
>>
>
>
> I am not sure how I wrote this. For the most part,
> it is plain wrong. I must have messed up in my tests.
>
> So, the real story is that a specific combination
> triggers the problem: XeTeX and extractpdfmark.
> Here is a standalone reproducer: take your file
> pygments.texinfo, and run
>
> PDFTEX=xetex texi2pdf -o pygments-initial.pdf pygments.texinfo && 
> extractpdfmark -o pygments.pdfmark pygments-initial.pdf && gs -dBATCH 
> -dNOSAFER -dNOPAUSE -sDEVICE=pdfwrite -dAutoRotatePages=/None 
> -dPrinted=false -sOutputFile=pygments-after-gs.pdf -c "30000000 
> setvmthreshold" -I out-fonts/ -I out-fonts/Font pygments.pdfmark 
> pygments-initial.pdf
>
> (I am not sure why having built LilyPond and passing
> "-I out-fonts -I out-fonts/Font" to gs is necessary.)
>
> Without PDFTEX=xetex, all is fine. With it, you should get
>
> GPL Ghostscript 9.54.0 (2021-03-30)
> Copyright (C) 2021 Artifex Software, Inc.  All rights reserved.
> This software is supplied under the GNU AGPLv3 and comes with NO 
> WARRANTY:
> see the file COPYING for details.
> Processing pages 1 through 1.
> Page 1
>    **** Error: File did not complete the page properly and may be 
> damaged.
>                Output may be incorrect.
>
> and the file pygments-after-gs.pdf, created from pygments-initial.pdf
> through gs, will not display bold.
>
> Also, forget about Firefox not displaying the bold glyphs.
> It actually does, but much more lightly, which is why I
> didn't notice it.


OK, solved. I did

$ qpdf --check pygments-initial-xetex.pdf
checking pygments-initial-xetex.pdf
PDF Version: 1.5
File is not encrypted
File is not linearized
ERROR: page 1: page object 3 0 stream 8 0 (content, offset 486): 
treating unexpected brace token as null

$ pdftotext pygments-initial-xetex.pdf
Syntax Error (315): Illegal character '{'
Syntax Error (322): Illegal character '}'
Syntax Error (339): Illegal character '{'
Syntax Error (343): Illegal character '}'
Syntax Error (367): Illegal character '{'
Syntax Error (367): Illegal character '}'
Syntax Error (373): Illegal character '{'
Syntax Error (373): Illegal character '}'
Syntax Error (384): Illegal character '{'
Syntax Error (384): Illegal character '}'
Syntax Error (402): Illegal character '{'
Syntax Error (402): Illegal character '}'
Syntax Error (424): Illegal character '{'
Syntax Error (424): Illegal character '}'
Syntax Error (432): Illegal character '{'
Syntax Error (432): Illegal character '}'

That seemed like a surprising concordance, so
I applied

diff --git a/Documentation/en/common-macros.itexi 
b/Documentation/en/common-macros.itexi
index 076992965c..f72f6e53ab 100644
--- a/Documentation/en/common-macros.itexi
+++ b/Documentation/en/common-macros.itexi
@@ -633,9 +633,9 @@ UNTRANSLATED NODE: IGNORE ME
  \else
    % for XeTeX
    \gdef\embolden#1#2{%
-    \special{pdf:literal direct {2 Tr #1 w}}%
+    \special{pdf:literal direct 2 Tr #1 w}%
        #2%
-    \special{pdf:literal direct {0 Tr 0 w}}%
+    \special{pdf:literal direct 0 Tr 0 w}%
    }
  \fi

and now it works (or seems to work).

Jean (in facepalm mode)

[prev in list] [next in list] [prev in thread] [next in thread] 

Configure | About | News | Add a list | Sponsored by KoreLogic