在 XeTeX 中通过 CID 插入字符

在 XeTeX 中通过 CID 插入字符

在 LuaTeX 中,我们可以使用\CID和通过 CID 插入字符\UTFluatexja-otf

\documentclass{ctexart}
\usepackage{luatexja-otf}
\setCJKmainfont{KozMinPr6N-Regular.otf}

\begin{document}
森\UTF{9DD7}外と内田百\UTF{9592}とが\UTF{9AD9}島屋に行く。

\CID{7652}飾区の\CID{13706}野家,\CID{1481}城市,葛西駅,高崎と\CID{8705}\UTF{FA11}
\end{document}

它们都是从 upTeX 继承而来的。那么如何使用 CID-key 在 XeTeX 中插入一些字符呢?

对于 Kozuka Mincho Pr6N,字形顺序与 CID 顺序 (Adobe Japan1-6) 相同。但其他字体可能不使用相同的顺序,因此\XeTeXglyph不能(至少不能直接)在此处使用 etc。

答案1

cidmap使用TeX Live 中的文件进行概念证明。

\documentclass{article}
\usepackage{xparse,xeCJK}

\setCJKmainfont{Hiragino Mincho ProN}

\ExplSyntaxOn

\NewDocumentCommand{\readCIDfile}{m}
 {
  \readcid_file:n { #1 }
 }

\NewDocumentCommand{\CID}{m}
 {
  \use:c { CID#1 }
 }
\NewDocumentCommand{\UTF}{m}
 {
  \symbol { \int_from_hex:n { #1 } }
 }

\ior_new:N \g_readcid_file_stream

\cs_new_protected:Nn \readcid_file:n
 {
  \ior_open:Nn \g_readcid_file_stream { #1 }
  \ior_str_map_inline:Nn \g_readcid_file_stream
   {
    \__readcid_line:n { ##1 }
   }
 }


\cs_new_protected:Nn \__readcid_line:n
 {
  \__readcid_line_aux:w #1 \q_stop
 }

\cs_new_protected:Npn \__readcid_line_aux:w #1 ~ #2 \q_stop
 {
  \str_if_eq:nnF { #1 } { #2 }
   {
    \str_case_e:nnF { \str_range:nnn { #2 } { 1 } { 3 } }
     {
      {/un}{ \__readcid_def_uni:nn { #1 } { #2 } }
      {/Ja}{ \__readcid_def_japan:nn { #1 } { #2 } }
      {./n}{ }
     }
     { \__readcid_def:nn { #1 } { #2 } }
   }
 }

\cs_new_protected:Nn \__readcid_def:nn
 {
  \str_if_in:nnTF { #1 } { . }
   {
    \__readcid_def:w #1 - { #2 }
   }
   {
    \__readcid_def_do:nn { #1 } { #2 }
   }
 }
\cs_new_protected:Npn \__readcid_def:w #1..#2 - #3
 {
  \int_step_inline:nnn { #1 } { #2 }
   {
    \__readcid_def_do:nn { ##1 } { #3 }
   }
 }
\cs_new_protected:Nn \__readcid_def_do:nn
 {
  \cs_new:cpx {CID#1} { \UTF { #2 } }
 }

\cs_new_protected:Nn \__readcid_def_uni:nn
 {
  \str_if_in:nnTF { #1 } { . }
   {
    \__readcid_def_uni_multi:w #1 - { #2 }
   }
   {
    \__readcid_def_uni_do:nn { #1 } { #2 }
   }
 }
\cs_new_protected:Npn \__readcid_def_uni_multi:w #1..#2 - #3
 {
  \int_step_inline:nnn { #1 } { #2 }
   {
    \__readcid_def_uni_do:nn { ##1 } { #3 }
   }
 }
\cs_new_protected:Nn \__readcid_def_uni_do:nn
 {
  \cs_new:cpx {CID#1} { \UTF { \str_range:nnn { #2 } { 5 } { 8 } } }
 }

\cs_new_protected:Nn \__readcid_def_japan:nn
 {
  \str_if_in:nnTF { #1 } { . }
   {
    \__readcid_def_japan_multi:w #1 - { #2 }
   }
   {
    \__readcid_def_japan_do:nn { #1 } { #2 }
   }
 }
\cs_new_protected:Npn \__readcid_def_japan_multi:w #1..#2 - #3
 {
  \int_step_inline:nnn { #1 } { #2 }
   {
    \__readcid_def_japan_do:nn { ##1 } { #3 }
   }
 }
\cs_new_protected:Nn \__readcid_def_japan_do:nn
 {
  \cs_new:cpx {CID#1} { \CID { \__readcid_japan_strip:w #2 \q_stop } }
 }
\cs_new:Npn \__readcid_japan_strip:w #1.#2.#3 \q_stop { #2 }

\ExplSyntaxOff


\readCIDfile{/usr/local/texlive/2019/texmf-dist/fonts/cid/fontforge/Adobe-Japan1-6.cidmap}

\begin{document}

森\UTF{9DD7}外と内田百\UTF{9592}とが\UTF{9AD9}島屋に行く。

森鷗外と内田百閒とが髙島屋に行く。

\CID{7652}飾区の\CID{13706}野家,\CID{1481}城市,葛西駅,高崎と\CID{8705}\UTF{FA11}

\CID{7652}飾区の

相关内容