![使用反斜杠和其后的非 ASCII 字符](https://linux22.com/image/304707/%E4%BD%BF%E7%94%A8%E5%8F%8D%E6%96%9C%E6%9D%A0%E5%92%8C%E5%85%B6%E5%90%8E%E7%9A%84%E9%9D%9E%20ASCII%20%E5%AD%97%E7%AC%A6.png)
我正在编写一个带有反斜杠()特殊字符的文本\
,该文本需要包含该字符和以下非 ASCII 符号(西里尔字母),因此例如我输入:
text \ц other text
我必须进行编译:
text <special char> other text
如您所见,该序列\ц
应转换为<special char>
。我该如何实现这一点?
我尝试定义该特殊字符如下:
\newcommand{\ц}{\char`\\\char"1089}
但是编译器抛出了错误。难道我不能退出 while 块以便按\
原样处理 char 吗?例如:
\escapetext{text \ц other text}
它将接受括号内的文本作为纯文本? 看来我不能用\verb
这个:
\verb$\ц$
因为它正在将字体更改为所需的字体。
附加信息:
我的文本包含许多\ц
、\д
等序列,将它们替换为\spc{ц}
、 等特定序列在我看来是不合适的,因为这会使文本源的编写和阅读变得更加复杂。有些时候我会将问题缩小到这个。我可以使用重新定义吗:
\newcommand{\ц}{\char`\\\char"1089}
与luatex
或xelatex
?
答案1
您不能在中定义该类型的命令pdflatex
,但可以使用不同的方法。
\documentclass{article}
\usepackage[T2A]{fontenc}
\usepackage[utf8]{inputenc}
\usepackage[russian]{babel}
\newcommand\spc[1]{%
\symbol{`\\}% the backslash
#1% the letter
}
\begin{document}
text \spc{ц} other text
\end{document}
你可能也做
\def\ц{\spc{ц}}
进而
text \ц other text
可以,但这是一种 hack,只有一个可以定义这种命令。
对于“转义”任意西里尔字符,你可以这样做
\documentclass{article}
\usepackage[T2A]{fontenc}
\usepackage[utf8]{inputenc}
\usepackage[russian]{babel}
\newcommand\spc[1]{%
\symbol{`\\}% the backslash
#1% the letter
}
\def\^^d0#1{\spc{^^d0#1}}
\def\^^d1#1{\spc{^^d1#1}}
\begin{document}
text \ц other text
text \э other text
\end{document}
它是如何工作的?
所提议的宏利用了 UTF-8 文件是如何由 读取的pdftex
,我记得,这是一个 8 位引擎。Unicode 中的基本西里尔字符位于 U+0400 到 U+047F 的位置,它们由 UTF-8 表示为以<D0>
和 为前缀的对<D1>
。例如,ц 由两个字节 表示<D1><86>
。
在 TeX 中,可以用符号 来表示一个字节^^xy
,其中xy
是一对(小写)十六进制数字(0123456789abcdef
)。
因此我定义控制符号\^^d0
并\^^d1
检索后续字节,打印反斜杠,然后放回第一个和第二个字节,以便通过inputenc
使用选项以通常的方式进行解释utf8
。