使用此 MWE,使用非 utf-8 引擎(如 pdflatex)
\documentclass{article}
\usepackage[utf8]{inputenc}
\begin{document}
\expandafter\def\csname a\endcsname{toto}
\expandafter\def\csname ᾧ\endcsname{toto}
\end{document}
\expandafter\def\csname a\endcsname{toto}
成功,\expandafter\def\csname ᾧ\endcsname{toto}
失败。我猜是因为 ᾧ 应该包含激活的字节。
我的问题是:是否可以让ᾧ在没有任何活动字符的情况下被读取,而是像一系列 1 字节字符一样?
如果没有解决方案,那也没关系。但我只是想问问,也许有 TeX 专家可以帮助我。
如果有一个解决方案,则可以ᾧ
作为宏的参数,例如:
\def\bar#1{
#1%Here #1 should use active code inside
\expandafter\def\csname #1\endcsname{toto}%Here, it should not.
}
\bar{ᾧ}
答案1
如果我们担心的只是潜在的活跃标记,那么 e-TeX\detokenize
会解决所有问题。
\documentclass{article}
\usepackage[utf8]{inputenc}
\begin{document}
\expandafter\def\csname a\endcsname{toto}
\expandafter\def\csname \detokenize{ᾧ}\endcsname{toto}
\expandafter\show\csname \detokenize{ᾧ}\endcsname
\end{document}
这适用于此处难看的多字节序列的所有字节,因此工作完成得很好。如果没有 e-TeX,我们可以使用\meaning
或 LaTeX 包装器来实现去标记化\@onelevel@santize
\documentclass{article}
\usepackage[utf8]{inputenc}
\begin{document}
\expandafter\def\csname a\endcsname{toto}
\makeatletter
\def\@tempa{ᾧ}
\@onelevel@sanitize\@tempa
\expandafter\def\csname \@tempa\endcsname{toto}
\expandafter\show\csname \@tempa\endcsname
\makeatother
\end{document}
(请注意,XeTeX 存在或至少曾经遇到过\detokenize
非 BMP 字符的问题。由于我们在这里使用的是 8 位引擎,所以应该没问题。)
答案2
我不确定这有什么用处。但你可以将 UTF-8 序列字符串化:
\documentclass{article}
\usepackage[utf8]{inputenc}
\newcommand{\utfcsdef}[1]{%
\expandafter\def\csname\stringify#1\endcsname
}
\def\stringify#1{%
\ifx#1\endcsname
\expandafter\endcsname
\else
\string#1%
\expandafter\stringify
\fi
}
\newcommand{\utfcsuse}[1]{%
\csname\stringify#1\endcsname
}
\utfcsdef{ᾧ}{toto}
\begin{document}
\utfcsuse{ᾧ}
\end{document}