表示 \newcommand 或 \def 中的文字字符

表示 \newcommand 或 \def 中的文字字符

考虑这个简短的 LaTeX 文档:

\documentclass[11pt]{article}

\usepackage[T2A]{fontenc}
\usepackage[utf8]{inputenc}
\usepackage[russian]{babel}

\def\name{...}

\begin{document}
Hello: \name
\end{document}

\def\name行将由程序生成,并将...包含表示字符串文字所需的 TeX,该字符串文字的值来自数据库。想想经典的邮件合并场景。

例如,如果数据值为Foo,则程序可以生成:\def\name{Foo},但如果数据值为$x+y$,则程序将需要输出类似的内容\def\name{\$x+y\$},以便$不会将其解释为切换到数学模式标记命令。

我的问题是:给定一个 Unicode 代码点序列,我如何以算法方式创建一个\def\newcommand语句,该语句在展开时将始终产生该 Unicode 字符的文字序列,而不可能将任何字符解释为标记命令。

我想该过程可能取决于正在使用的包,因此您可以假设上述包是有效的 - 尽管有一个独立于上下文工作的程序会很好。

答案1

由于您使用的是 (pdf)tex 和 utf8 输入,因此使用常用字符\detokenize\meaning避免使用特殊字符会比较棘手,因为您需要保留第 8 位设置为活动的字符,以便 utf-8 解码有效。

在生成文档时,您实际上不需要太多特殊字符$&并且%所有特殊字符都可以全局设置为 catcode 12(正常标点符号)。您可以使用\( \)数学运算,避免注释并使用\newcell定义的 via\let\newcell&来分隔表格单元格。

您需要一个转义符,如果有任何你知道字符不会出现(例如 U+0001 在正常文档中没有太多出现的权利),那么你可以给这个字符 catcode 0 并使用它来代替\

我对 pdf 版本 MathML 规范的生成 TeX 源使用了类似的方案。

相关内容