TOPtesi, virgola intelligente e unicode-math

  • Creatore
    Topic
  • #122290
    Up
    0
    Down
    ::


    Consideriamo il seguente EMC
    `\documentclass[
    tipotesi=custom,%
    ]{toptesi}

    \usepackage{unicode-math}

    \setmainfont{XITS}
    \setmathfont{XITS Math}

    \begin{document}

    \(\pi\approx 3,14\)

    \(\pi\approx 3, 14\)

    \end{document}`
    che ho compilato con il seguente comando
    `latexmk –halt-on-error –file-line-error -lualatex ./foo.tex`
    Funziona tutto! Tuttavia, cercando di copiarne il contenuto ho ottenuto
    `π ≈ 3;14
    π ≈ 3; 14`
    come si può vedere la virgola intelligente c’è, ma è un punto e virgola. Infatti, il code point Unicode del glifo in questione è [font=”monospace”]U+003B : SEMICOLON[/font]. A pag. 26 del TR25 è riportato

    The period (U+002E FULL STOP) and U+002C COMMA are widely used as numerical punctuation, however, their meaning depends on local conventions.

    e lo stesso è confermato qui da [font=”monospace”]unicode-math[/font].
    Controllando, con FontForge, effettivamente la virgola ha proprio quel code point nel font XITS Math.
    Quindi ho eseguito il seguente comando
    `pdffonts ./foo.pdf`
    scoprendo che il font usato non è OTF, ma Type 1 per la precisione è il Computer Modern Math Italic in corpo 10
    `name type encoding emb sub uni object ID
    ———————————— —————– —————- — — — ———
    IOPIZX+XITSMath-Regular CID Type 0C Identity-H yes yes yes 4 0
    APBXHK+CMMI10 Type 1 Builtin yes yes no 5 0
    IZLSCG+XITS-Regular CID Type 0C Identity-H yes yes yes 6 0
    `
    Così ho provato a cercare il “colpevole” e ho trovato, nel file toptesi.dtx, il seguente frammento, che dal commento è proprio il responsabile della gestione della virgola intelligente
    `% The cryptic code that redefines the comma in math mode
    % establishes that this character is a normal math character,
    % instead of a math punctuation mark. Actually the code
    % that defines the mathematical active comma is a new
    % addition that lets the comma perform correctly in its
    % double function (decimal separator and punctuation mark).
    % The only point where this code fails is when a list of
    % numbers is typeset: when a numeric list must be typeset,
    % such as, for example, $\forall i=0,\,1,\,2,\,3, n$, in the
    % source code a space \emph{must} be inserted after every
    % punctuating comma while no space follows a decimal comma:
    % for example \verb*+$\forall i=0, 1, 2, 3,n$+. The space
    % before the |n| is not necessary (but it wouldn't hurt)
    % because |n| is not recognised as a digit, therefore the
    % “intelligent” comma inserts the necessary space by itself.
    %
    % \begin{macrocode}
    \DeclareMathSymbol{\virgola}{\mathpunct}{letters}{“3B}
    \DeclareMathSymbol{\virgoladecimale}{\mathord}{letters}{“3B}
    \AtBeginDocument{\mathcode`\,=\string”8000}
    {\catcode `,=\active \gdef,{\futurelet\let@token\m@thcomma}}
    \def\m@thcomma{\let\@tempB\virgola
    \@tfor\@tempA:=0123456789\do{%
    \expandafter\ifx\@tempA\let@token\let\@tempB\virgoladecimale
    \@break@tfor\fi}\@tempB}
    %
    \catcode`\^^Z=10
    \topmargin 0pt
    % \end{macrocode}`
    C’è la possibilità di ottenere il glifo corretto, senza copiare e modificare TOPtesi?

Visualizzazione 10 filoni di risposte
  • Autore
    Risposte
    • #122291
      OldClaudio
      Partecipante
        Up
        0
        Down
        ::


        A me il tuo esempio funziona correttamente usando LuaLaTeX
        `% !TEX TS-program = LuaLaTeX
        % !TEX encoding = UTF-8 Unicode
        \documentclass[
        tipotesi=custom,%
        ]{toptesi}

        \usepackage{unicode-math}

        \setmainfont{XITS}
        \setmathfont{XITS Math}

        \begin{document}

        \(\pi\approx 3,14\)

        \(\pi\approx 3, 14\)

        \end{document}
        `

      • #122292
        Up
        0
        Down
        ::


        Concordo sul fatto che alcuni PDF reader (tra cui Preview di Apple) copiano correttamente la virgola intelligente. In questa clip si vede cosa accade copiando un numero con virgola da Adobe Acrobat Reader (Build: 24.5.20320.0) a TextEdit (ho ingradito volontariamente il testo). Inoltre usando Cmd + D, mostro i font nel file PDF.

      • #122293
        Up
        0
        Down
        ::

        miticollo” post=122863Concordo sul fatto che alcuni PDF reader (tra cui Preview di Apple) copiano correttamente la virgola intelligente. In questa clip si vede cosa accade copiando un numero con virgola da Adobe Acrobat Reader (Build: 24.5.20320.0) a TextEdit (ho ingradito volontariamente il testo). Inoltre usando Cmd + D, mostro i font nel file PDF.

        Vedo. Ho aggiornato Adobe Acrobat Reader e copia “;”.

        Qualsiasi altro programma copia “,”, compreso [tt]pdftotext[/tt]

        ???? ≈ 3,14
        ???? ≈ 3, 14

        Vabbè, qui non si riesce a mostrare il pigreco, ma non è lì il problema.

        Ciao
        Enrico

      • #122294
        OldClaudio
        Partecipante
          Up
          0
          Down
          ::


          @egreg, non metto in dubbio su quanto dici in merito al fatto che Adobe Reader fa vedere “;” invece di “,”. Ma a me non succede guardando il PDF composto davvero con LuaLaTeX che ho mostrato qualche giorno fa. Sia Adobe Reader sia Adobe Acrobat questi miei due programmi mostrano la virgola. Invece con l’EMC di @miticollo, usciva il segno “;”.
          Mi era venuto il sospetto che @miticollo avesse composto il suo EMC con pdfLaTeX anche da qualche indizio sui font usati descritti nella sua analisi. Ovviamante non ne sono certo.

        • #122295
          Up
          0
          Down
          ::


          Grazie Enrico di aver controllato. Ho provato diversi PDF reader su diversi OS. Evince su Manjaro (distro Linux) non presenta questo difetto. Su Windows 10 con Adobe Acrobat Pro (Build: 24.002.20991.0) è possibile copiare correttamente la virgola solo se si effettua la [font=”monospace”]Copia con formattazione[/font], non presente sulla versione per macOS. Su Windows 11 con Adobe Acrobat Pro (Build: 24.005.20320.0) vale quanto detto prima. Inoltre, sempre su Windows 11 ho testato anche Foxit, che presenta il difetto, e SumatraPDF, che invece non lo presenta. Infine su macOS 13 ho testato sia Preview sia Skim, i quali non presentano il difetto.

          Qui un video che mostra, su Windows 11, come “aggirare” il difetto su Adobe. Inoltre sono mostrati altri PDF reader, in ordine di apparizione: Adobe, Adobe, SumatraPDF, Foxit e FireFox (PDF.js).

          Dal tuo articolo, Simboli matematici in TEX e LATEX, ho imparato che

          Per convenzione, nella famiglia 0 c’è sempre il font con cui si scrive il testo normale; nella famiglia 1 il font per il corsivo matematico, cioè per le lettere da usare comunemente nelle formule; nella famiglia 2 c’è un font per i simboli più frequenti; la famiglia 3 contiene il font per i simboli ‘grandi’, come parentesi ingrandibili, sommatoria, integrale e altri.

          ho modificato l’EMC nel modo seguente
          `\documentclass[
          tipotesi=custom,%
          ]{toptesi}

          \usepackage{unicode-math}

          \DeclareMathSymbol{\virgola}{\mathpunct}{operators}{“2C}
          \DeclareMathSymbol{\virgoladecimale}{\mathord}{operators}{“2C}

          \setmainfont{XITS}
          \setmathfont{XITS Math}

          \begin{document}

          \(\pi\approx 3,14\)

          \(\pi\approx 3, 14\)

          \end{document}`
          L’idea mi è venuta perché effettivamente il punto e virgola ha Unicode code point [font=”monospace”]0x3B[/font] sia in XITS sia in XITS Math, mentre la virgola [font=”monospace”]0x2C[/font]. Spero che il glifo provenga da XITS Math e non XITS, che sarebbe da usare solo per il testo.

          Il tuo articolo mi ha ispirato anche un’altra idea che mi piace di meno perché dovrei mettere mano a [font=”monospace”]toptesi.dtx[/font]. In particolare dall’analisi del pacchetto [font=”monospace”]icomma[/font], ho scoperto che

          [font=”monospace”]\mathcomma[/font]. Questo comando è definito usando il codice matematico della virgola, lo si fa a inizio del documento per evitare problemi nel caso si usino pacchetti che assegnano alla virgola un codice matematico insolito

          perciò basterebbe modificare le seguenti righe
          ` \DeclareMathSymbol{\virgola}{\mathpunct}{letters}{“3B}
          \DeclareMathSymbol{\virgoladecimale}{\mathord}{letters}{“3B}`
          in
          `\mathchardef\virgola\mathcode`\,%
          \newcommand{\virgoladecimale}{\mathord{\virgola}}`
          Qui ne propongo una versione applicandola alla classe report, che è alla base di TOPtesi.
          `\documentclass{report}

          \usepackage{unicode-math}

          \setmainfont{XITS}
          \setmathfont{XITS Math}

          \AtBeginDocument{%
          \mathchardef\virgola\mathcode`\,%
          \newcommand{\virgoladecimale}{\mathord{\virgola}}
          \mathcode`\,=”8000 %
          }
          \makeatletter
          {\catcode `,=\active \gdef,{\futurelet\let@token\m@thcomma}}
          \def\m@thcomma{\let\@tempB\virgola
          \@tfor\@tempA:=0123456789\do{%
          \expandafter\ifx\@tempA\let@token\let\@tempB\virgoladecimale
          \@break@tfor\fi}\@tempB}
          \makeatother
          %
          \catcode`\^^Z=10
          \topmargin 0pt

          \begin{document}

          \(\pi\approx 3,14\)

          \(\pi\approx 3, 14\)

          \end{document}`
          Diciamo una “via di mezzo” tra la soluzione di TOPtesi e [font=”monospace”]icomma[/font].

          Inoltre queste due soluzioni assicurano che i font siano solo XITS e XITS Math, eseguendo [font=”monospace”]pdffonts[/font]
          `name type encoding emb sub uni object ID
          ———————————— —————– —————- — — — ———
          RRAJGD+XITSMath-Regular CID Type 0C Identity-H yes yes yes 4 0
          IZLSCG+XITS-Regular CID Type 0C Identity-H yes yes yes 5 0
          `

          Claudio ti allego i PDF che ho tipo-composto con LuaLaTeX, come puoi verificare tu stesso dalle loro proprietà. Inoltre io uso sempre il comando
          `latexmk –halt-on-error –file-line-error -lualatex ./foo.tex`
          Il fatto è che visivamente la virgola appare sempre, ma under the hood Adobe incolla un punto e virgola. Inoltre provando a cercare un numero decimale con la virgola sia Adobe sia Foxit non lo trovano perché si aspettano il punto e virgola.

          Attachments:
          You must be logged in to view attached files.
        • #122296
          OldClaudio
          Partecipante
            Up
            0
            Down
            ::


            Ci sono due aspetti che mi stupiscono nei tuoi risultati.

            a) Sul mio Mac con il sistema operativo Sonoma 14.16.1 il tuo esempio difettoso mi appare con la virgola sia aprendolo in Safari cliccando sull’icona del link, sia chiedendo di aprirlo con Adobe Reader, sia, ancora, con Adobe Acrobat 2020, che è una versione Pro a pagamento per le Università.

            b) Nei font OpenType sia testuali sia matematici la pagina 0 contiene solo i simboli ASCII che vanno dal codepoint 0 al 127, di cui i primi 32 sono quelli per telescrivente e ai fini del sistema TeX contengono solo il Line Feed (LF), il Carriage Return (CR) e un’altro paio dello stesso genere.

            Ogni editor moderno per gestire i file sorgente del sistema TeX usa di default la codifica UTF-8 che sostanzialmente è una transcodifica del’Unicode, più comoda per gestire i caratteri alfabetici delle lingue occidentali; tra questi editor ci sono TeXShop, TeXworks, TeXstudio e diversi altri: il primo gira solo sul Mac, gli altri due sono multipiattaforma; quindi quando specifichi il codepoint per la virgola ASCII, usi sempre l’indirizzo “3B. Non ho controllato che cosa succede con i font XITS testuali e matematici, ma se mettono la virgola in posizione “3C, questo è un loro problema perché non starebbero usando la codifica Unicode.

            D’altro canto ho sperimentato che, usando LuaLaTeX, l’apostrofo della tastiera viene riferito al codepoint “39, e il sistema TeX in genere lo tratta come apice in matematica e come virgoletta semplice alta chiusa in modo testo; invece LuaLaTeX usa per l’apice il codice “39 e per la virgoletta semplice alta chiusa un codepoint di 4 cifre esadecimali cosa che interferisce con la cesura in fin di riga per l’italiano e le altre lingue che usano l’apocope, cioè la caduta della vocale terminale degli articoli e di alcuni aggettivi seguiti da una parola che comincia con una vocale.
            Quindi non mi stupirei se diverse distribuzioni del sistema TeX, per esempio slackware, non usano la LICR (LaTeX Internal Character Representation) che trasforma la codifica del driver di tastiera in codice interno che a sua volta in uscita viene convertito nella codifica dei font in uso.

            Le modifiche che tu suggerisci per toptesi sono probabilmente possibili e utili come succede a te, ma non modificherei toptesi, bensì inserirei nel preambolo le due ridefinizioni della \virgola e della \virgoladecimale, che al limite potrebbero essere ancora diverse da quelle che proponi, perché, specialmente nel mondo Linux, c’è una certa, ehm, anarchia e non tutte le installazioni Debian e non Debian danno gli stessi risultati

          • #122297
            Up
            0
            Down
            ::

            Sul mio Mac con il sistema operativo Sonoma 14.16.1 il tuo esempio difettoso mi appare con la virgola sia aprendolo in Safari cliccando sull’icona del link, sia chiedendo di aprirlo con Adobe Reader, sia, ancora, con Adobe Acrobat 2020, che è una versione Pro a pagamento per le Università.

            Come ho già detto, anche a me appare tutto correttamente. Questo è uno screenshot preso da Adobe Acrobat Reader DC (Build: 21.007.20091.59174)
            [attachment=2834]r1.png[/attachment]
            Il problema accade solo quando si tenta di copiare dal PDF oppure si prova a cercare con Cmd + F su Adobe.

            Ogni editor moderno per gestire i file sorgente del sistema TeX usa di default la codifica UTF-8 che sostanzialmente è una transcodifica del’Unicode, più comoda per gestire i caratteri alfabetici delle lingue occidentali; tra questi editor ci sono TeXShop, TeXworks, TeXstudio e diversi altri: il primo gira solo sul Mac, gli altri due sono multipiattaforma; quindi quando specifichi il codepoint per la virgola ASCII, usi sempre l’indirizzo “3B. Non ho controllato che cosa succede con i font XITS testuali e matematici, ma se mettono la virgola in posizione “3C, questo è un loro problema perché non starebbero usando la codifica Unicode.

            Controllando il file sorgente con ImHex, un editor esadecimale, posso confermare che nel file sorgente c’è il carattere [font=”monospace”]U+002C[/font], dove c’è la virgola.
            In TOPtesi è dichiarato
            `
            \DeclareMathSymbol{\virgola}{\mathpunct}{letters}{“3B}
            \DeclareMathSymbol{\virgoladecimale}{\mathord}{letters}{“3B}`
            La famiglia indicata da [font=”monospace”]letters[/font] è Computer Modern Math Italic in corpo 10, andiamo a confrontare la posizione del glifo virgola con XITS Math, usando FontForge. Possiamo eseguire il comando
            `fontforge /usr/local/texlive/2024/texmf-dist/fonts/{type1/public/amsfonts/cm/cmmi10.pfb,opentype/public/xits/XITSMath-Regular.otf}`
            i percorsi li ho trovati nel log della compilazione.
            [attachment=2837]cmp.jpg[/attachment]
            Come si vede, in CMMI10 la virgola corrisponde a [font=”monospace”]0x3B[/font], mentre in XITS Math corrisponde a [font=”monospace”]0x2C[/font] e [font=”monospace”]0x3B[/font] è il punto e virgola.
            Controllando la Controls and Basic Latin Code Chart Unicode a pag. 4 si trova quanto segue
            [attachment=2832]comma.png[/attachment]
            mentre a pag. 5 si trova
            [attachment=2833]semicolon.png[/attachment]
            La famiglia indicata da [font=”monospace”]letters[/font] rappresenta il corsivo matematico, che nel caso si usi un font Unicode con supporto matematico come XITS Math è già compreso nella famiglia 0. Infatti, riferendoci alla Mathematical Alphanumeric Symbols Code Chart Unicode troviamo a pag. 6 il corsivo matematico utile per variabili. Ecco perché nella mia ridefinizione ho cambiato [font=”monospace”]letters[/font] con [font=”monospace”]operators[/font].

            Tuttavia, non tutto è perduto. Se si compila il seguente EMC
            `\documentclass[
            tipotesi=custom,%
            ]{toptesi}

            \usepackage{stix}

            \begin{document}

            \(\pi\approx 3,14\)

            \(\pi\approx 3, 14\)

            \end{document}`
            con
            `latexmk –halt-on-error –file-line-error -pdflatex ./foo.tex`
            dopo aver eliminato i font OTF non supportati da PDFLaTeX, si ottiene un risultato che è copiato correttamente.

            Perciò il suggerimento di cambiare [font=”monospace”]toptesi.dtx[/font]
            `\mathchardef\virgola\mathcode`\,%
            \newcommand{\virgoladecimale}{\mathord{\virgola}}`
            permetterebbe di far funzionare la virgola intelligente sia in PDFLaTeX con suoi OT1 e T1 font sia in XeLaTeX/LuaLaTeX con i loro OTF e TTF font, indipendentemente che la virgola abbia codice [font=”monospace”]0x2C[/font] oppure [font=”monospace”]0x3B[/font].

            specialmente nel mondo Linux, c’è una certa, ehm, anarchia e non tutte le installazioni Debian e non Debian danno gli stessi risultati

            Nel mio caso uso TeXLive 2024 aggiornato quotidianamente e scaricato da [font=”monospace”]tug.org[/font], niente pachetti datati dalle repo della mia distro.

            Attachments:
            You must be logged in to view attached files.
          • #122298
            OldClaudio
            Partecipante
              Up
              0
              Down
              ::


              OK; compili con LaTeXmk. Prova a compilare con LuaLaTeXmk. Perché con LaTeXmk, compili con pdflatex. Pdflatex non se ne fa niente dei font KITS-Math. e se guardi il file .log della tua compilazione dovresti verificare che l’estensione unicode-math non è stata caricata.
              Il mio Mac e, in particolare, il mio TeXShop mi permette di usare diversi script di composizione con gli mk che sono distinti per compilare con ciascuno dei tre programmi di composizione basati sul mark-up di LaTeX.
              Il main file di toptesi, inoltre distingue il motore di composizione usato e fa cose diverse a seconda del compilatore usato.

            • #122299
              Up
              0
              Down
              ::


              Non posso compilare con LuaLaTeXmk perché non è presente nella mia distribuzione. Credo che comunque sia solo uno shortcut per eseguire
              `latexmk -lualatex`
              che come riporta la documentazione di LaTeXmk
              [attachment=2838]man.png[/attachment]
              compila con LuaLaTeX.

              Tuttavia posso lasciarti i file di log da cui è possibile vedere che effettivamente è compilato con LuaLaTeX. Inoltre ho incluso [font=”monospace”]lualatex-more-verbose.txt[/font] in cui ho aumentato al massimo la verbosità di luaotfload per mostrare che effettivamente “entra in gioco” per caricare gli OTF.

              Attachments:
              You must be logged in to view attached files.
            • #122300
              OldClaudio
              Partecipante
                Up
                0
                Down
                ::


                E i PDF che ottieni con LuaLaTeX contengono ancora il problema descritto nel vari messaggi di questo filone?

              • #122301
                Up
                0
                Down
                ::


                Si, il PDF [font=”monospace”]difettoso.pdf[/font] è tipo-composto con LuaLaTeX e presenta questo problema.

            Visualizzazione 10 filoni di risposte
            • Devi essere connesso per rispondere a questo topic.

            Go to top