plain – accenti

  • Creatore
    Topic
  • #65471
    Up
    0
    Down
    ::


    Salve a tutti.

    Ho scritto il codice per gli accenti di un font opentype da usare con XeTeX. Il codice è il seguente:

    `
    % grave
    \def\`#1{{\accent96 #1}}
    % acuto
    \def\'#1{{\accent180 #1}}
    % caron/hacek
    \def\v#1{{\accent711 #1}}
    % breve sopra
    \def\u#1{{\accent728 #1}}
    % macron sopra
    \def\=#1{{\accent175 #1}}
    % circonflesso
    \def\^#1{{\accent710 #1}}
    % punto sopra
    \def\.#1{{\accent729 #1}}
    % umlaut lungo ungherese (doppio acuto)
    \def\H#1{{\accent733 #1}}
    % tilde
    \def\~#1{{\accent732 #1}}
    % unlaut o dieresis
    \def\”#1{{\accent168 #1}}
    `

    I numeri relativi ai glifi degli accenti li ho ricavati dalla tabella caratteri di ubuntu e da FontMatrix.

    Gli accenti sono tutti corretti, tranne il primo, l’accento grave, che sul documento risulta come una specie di piccola `c’ (quando si trova sotto la lettera credo che si chiami `ogonek’) sia sulle lettere minuscole che su quelle maiuscole.

    Nella ricerca del carattere adatto da usare come accento grave ho scritto il seguente codice

    `
    \newcount\charnum\charnum=1
    \def\writeall{%
    \def\`##1{{\expandafter\accent\the\charnum ##1}}
    \`a \`A \the\charnum\par
    \ifnum\charnum=1000
    \let\next\relax
    \else
    \advance\charnum by1
    \let\next\writeall
    \expandafter\fi\next}
    \writeall
    `
    che usa tutti i caratteri da 1 a 1000 come accento scrivendoli su righe di prova; nelle 23 pagine risultanti non è uscito l’accento grave.

    Ho provato anche con altri fonts opentype, con lo stesso risultato.

    Come si fa a settare l’accento grave?

    Grazie, ciao.

Visualizzazione 2 filoni di risposte
  • Autore
    Risposte
    • #65472
      Up
      0
      Down
      ::

      Sam Qasbah” post=64515Salve a tutti.

      Ho scritto il codice per gli accenti di un font opentype da usare con XeTeX. Il codice è il seguente:

      Come si fa a settare l’accento grave?

      Grazie, ciao.

      Non certo così. È sbagliato fin dal principio: i font OpenType non hanno gli accenti come i font tradizionali TeX, ma usano combinazioni predefinite.

      Per esempio, “è” (U+00E8) può essere ottenuto come U+0065/U+0300, dove U+0300 si chiama COMBINING GRAVE ACCENT. Potresti ottenere il risultato voluto con
      `\XeTeXinputnormalization=1 % XeTeX esegue la combinazione e vede il carattere combinato come unico
      % grave
      \def\`#1{#1^^^^0300}
      % acuto
      \def\'#1{#1^^^^0301}
      % caron/hacek
      \def\v#1{#1^^^^030c}
      % breve sopra
      \def\u#1{#1^^^^0306}
      % macron sopra
      \def\=#1{#1^^^^0304}
      % circonflesso
      \def\^#1{#1^^^^0302}
      % punto sopra
      \def\.#1{#1^^^^0307}
      % umlaut lungo ungherese (doppio acuto)
      \def\H#1{#1^^^^030b}
      % tilde
      \def\~#1{#1^^^^0303}
      % unlaut o dieresis
      \def\”#1{#1^^^^0308}
      `
      Ma impara a usare Unicode anche per l’input, vivrai molto più sereno. Non con tutti i font il posizionamento delle combinazioni è perfetto e, in realtà, sarebbe meglio un approccio indiretto.
      `\def\`#1{\ifcsname grave@#1\endcsname\csname grave@#1\endcsname\else#1^^^^0300\fi}
      \chardef\grave@a=”E0
      \chardef\grave@e=”E8
      …`
      In questo modo useresti il carattere vero e proprio.

      Ciao
      Enrico

    • #65473
      Up
      0
      Down
      ::

      egreg9″ post=64517

      Salve a tutti.

      Ho scritto il codice per gli accenti di un font opentype da usare con XeTeX. Il codice è il seguente:

      Come si fa a settare l’accento grave?

      Grazie, ciao.

      Per esempio, “è” (U+00E8) può essere ottenuto come U+0065/U+0300, dove U+0300 si chiama COMBINING GRAVE ACCENT. …
      Ciao
      Enrico

      Grazie infinite per la risposta, ma purtroppo non su tutti i fonts è presente il carattere U+0300. La tabella caratteri di ubutu non è affidabile da questo punto di vista, i caratteri effettivamente presenti li mostra FontMatrix. Il Minion Pro sembra avere un unico accento grave, il carattere U+0060.

      Tra l’altro sembra che il problema sia parecchio complicato: Jonathan Kew sostiene che dipende dal “tex-text” font mapping, il quale converte il carattere U+0060 (`) con U+2018 (l’ogonek). Le soluzioni proposte in quel post sono tutte impraticabili: rinunciare a “tex-text”, dovendo così anche rinunciare agli apici e ai trattini in stile TeX, o addirittura mettere mani nei files della mappatura, perdendo così la compatibilità con altre macchine o con altre versioni del TeXLive.

      Ho la sensazione di essermi scontrato, come a volte succede, con uno dei limiti del sistema.

      Come workaround credo si possa usare qualcosa del genere:

      `% grave
      \def\`#1{%
      \if#1a\char224\fi
      \if#1A\char192\fi
      \if#1e\char232\fi
      \if#1E\char200\fi
      \if#1i\char236\fi
      \if#1I\char204\fi
      \if#1o\char242\fi
      \if#1O\char210\fi
      \if#1u\char249\fi
      \if#1U\char217\fi}
      `

      (edit. Mi accorgo solo ora che questo codice è una versione “povera” di quello proposto da Enrico. A essere sincero non avevo mai visto prima il comando \ifcsname 😳 )

      Certo è poco elegante e limitato (ad esempio credo che non funzioni con gli small-caps, ma non ho fatto prove al riguardo), ma sembra essere la cosa più vicina ad una soluzione.

      Grazie, ciao.

    • #65474
      Up
      0
      Down
      ::

      Sam Qasbah” post=64520

      [quote=”Sam Qasbah” post=64515]Salve a tutti.

      Ho scritto il codice per gli accenti di un font opentype da usare con XeTeX. Il codice è il seguente:

      Come si fa a settare l’accento grave?

      Grazie, ciao.

      Per esempio, “è” (U+00E8) può essere ottenuto come U+0065/U+0300, dove U+0300 si chiama COMBINING GRAVE ACCENT. …
      Ciao
      Enrico

      Grazie infinite per la risposta, ma purtroppo non su tutti i fonts è presente il carattere U+0300. La tabella caratteri di ubutu non è affidabile da questo punto di vista, i caratteri effettivamente presenti li mostra FontMatrix. Il Minion Pro sembra avere un unico accento grave, il carattere U+0060.

      Tra l’altro sembra che il problema sia parecchio complicato: Jonathan Kew sostiene che dipende dal “tex-text” font mapping, il quale converte il carattere U+0060 (`) con U+2018 (l’ogonek). Le soluzioni proposte in quel post sono tutte impraticabili: rinunciare a “tex-text”, dovendo così anche rinunciare agli apici e ai trattini in stile TeX, o addirittura mettere mani nei files della mappatura, perdendo così la compatibilità con altre macchine o con altre versioni del TeXLive.

      Ho la sensazione di essermi scontrato, come a volte succede, con uno dei limiti del sistema.

      Come workaround credo si possa usare qualcosa del genere:

      `% grave
      \def\`#1{{\def\tmp{#1}%
      \def\a{a}\def\A{A}\def\e{e}\def\E{E}\def\i{i}\def\I{I}%
      \def\o{o}\def\O{O}\def\u{u}\def\U{U}%
      \ifx\tmp\a\char224\fi
      \ifx\tmp\A\char192\fi
      \ifx\tmp\e\char232\fi
      \ifx\tmp\E\char200\fi
      \ifx\tmp\i\char236\fi
      \ifx\tmp\I\char204\fi
      \ifx\tmp\o\char242\fi
      \ifx\tmp\O\char210\fi
      \ifx\tmp\u\char249\fi
      \ifx\tmp\U\char217\fi}}
      `

      (edit. Mi accorgo solo ora che questo codice è una versione “povera” di quello proposto da Enrico. A essere sincero non avevo mai visto prima il comando \ifcsname 😳 )

      Certo è poco elegante e limitato (ad esempio credo che non funzioni con gli small-caps, ma non ho fatto prove al riguardo), ma sembra essere la cosa più vicina ad una soluzione.

      Grazie, ciao.[/quote]
      Se Minion Pro non ha il carattere la colpa è di chi l’ha preparato. L’unico vero modo è di usare Unicode come input (UTF-8). L’alternativa è di crearsi una lunga mappa di sostituzioni come quella che ti ho indicato; certo non con quella sequela di `\ifx`. 🙂 L’idea è più o meno la stessa di fontenc: si definiscono le combinazioni che corrispondono a un carattere esistente e per le altre si ricorre a un sostituto. Il vantaggio è che una volta creata la mappa, tutti i font possono usare la stessa. Un po’ di codice al riguardo, scritto per passatempo, ce l’ho.

      Ciao
      Enrico

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

Go to top