这是一个有点奇怪的问题。
假设由于某些未知的原因,我想让字符 ɲ (U+0272, 0xc9 0xb2) 表示“再见”,字符 ɳ (U+0273, 0xc9 0xb3) 表示“啊”,序列 ɲɳ 表示“嗨”。
为此,我写了以下内容:
\documentclass{standalone}
\makeatletter
\DeclareUnicodeCharacter{0272}{bye\ }
{
\catcode`^^c9=12
\catcode`^^b2=12
\expandafter\global\expandafter\let\expandafter\tmp\csname u8:^^c9^^b2\endcsname
}
\def\test{\@ifnextchar^^c9{\@test}{\tmp}}
\def\@test#1{\@ifnextchar^^b3{hi\ \@gobble}{\tmp^^c9}}
\DeclareUnicodeCharacter{0272}{\test}
\DeclareUnicodeCharacter{0273}{aww\ }
\begin{document}
ɲɲɲɳɳɳ
\end{document}
现在这确实有效了:它确实输出了“bye bye hi aww aww”。那么我的问题是这有多“安全”。假设我有两个 unicode 字符 u1 和 u2,它们都在 U+0000 到 U+007f 范围之外。我将 u1u2 定义为某个任意宏,同时保留它们各自的功能(例如,u1 可能已经由包定义,而 u2 可能会抛出字符不支持错误),如上面的代码所示。
是否存在 u1 和 u2,使得上述过程无法按预期进行,或者这完全没问题?
答案1
那么我的问题是这有多“安全”
它足够安全,但是它确实依赖于 inputenc UTF-8 支持的内部结构,而这种支持可能会(并且过去已经)发生变化。
是否存在 u1 和 u2,使得上述程序不起作用
您展示的版本仅适用于 UTF-8 中占用两个八位字节的 unicode 范围。对于更高的值,您需要检查以下字符的 3 或 4 个字节。
\tmp
我知道这只是一个例子,但是当人们从旧帖子中复制代码时,值得一提的是,这应该是特定于 U+0272 的内部命令,因此它不会被使用命令的任何其他内容覆盖\tmp
。