考虑这个简短的 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 源使用了类似的方案。