inputenc、active catcode 和 \csnsame

inputenc、active catcode 和 \csnsame

使用此 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}

相关内容