如何使用 pdfTeX 输入任意 Unicode 代码点?

如何使用 pdfTeX 输入任意 Unicode 代码点?

我刚刚发现

如何在我的文档中输入任意 Unicode 代码点?

但我想对 pdfTeX 而不是 LuaTeX 执行相同操作。这可能吗?

答案1

我假设,Unicode 字符以四位十六进制数字给出(或代理对的八位十六进制数字)。然后宏\uni执行以下步骤:

  • 首先将十六进制字符串扩展为八个十六进制数字,以获得编码中 Unicode 字符的完整十六进制表示UTF-32BE
  • \pdfunescapehex将十六进制数字转换为编码中的四个字节UTF-32BE
  • stringenc从 转换UTF-32BEUTF-8
  • \scantokens用于将非活动字符(类别代码 12/其他)的字符串转换为utf8包编码所需的活动字符inputenc
  • 由于定义很脆弱,因此通过 使宏变得健壮\DeclareRobustCommand
  • 此外,还添加了支持hyperref,以便\uni可以在书签中使用定义的宏。

完整示例:

\documentclass{article}
\usepackage[T1]{fontenc}
\usepackage{lmodern}
\usepackage{textcomp}
\usepackage[utf8]{inputenc}

\usepackage{stringenc}
\newcommand*{\uni}{}
\DeclareRobustCommand*{\uni}[1]{%
  \begingroup
    \StringEncodingConvert\x{%
      \pdfunescapehex{%
        00%
        \ifnum"#1<"100000 0\fi
        \ifnum"#1<"10000 0\fi
        \ifnum"#1<"1000 0\fi
        \ifnum"#1<"100 0\fi
        \ifnum"#1<"10 0\fi
        #1%
      }%
    }{utf32be}{utf8}%
    \everyeof{\noexpand}%
    \endlinechar=-1 %
  \edef\x{%
    \endgroup
    \scantokens\expandafter{%
      \expandafter\unexpanded\expandafter{\x}%
    }%
  }\x
}

% hyperref support
\usepackage[pdfencoding=auto]{hyperref}
\pdfstringdefDisableCommands{%
  \def\uni#1{\unichar{"#1}}%
}

\begin{document}
\section{Musical note \uni{266A} in title}
Symbols: \uni{266A}, \uni{B1}, \uni{20AC}, \uni{DF}.
\end{document}

结果

相关内容