我有一个 XeLaTeX 文档,我想在其中自动替换一些 Unicode 符号,例如 ¼ → 1/4、» → >>、« → <<。但是,与其使用像
\catcode`\¼=\active\def¼{1/4}
\catcode`\«=\active\def«{<<}
...
我想要更优雅的东西,比如
\subst¼{1/4}
\subst«{<<}
\subst—{---}
因此,我需要一个宏,它将接受两个参数,使 #1 处于活动状态,并使用 #2 对其进行 \def。第一部分很简单:
\def\subst#1#2{
\catcode`#1=\active
...
}
棘手的部分是嵌套的 \def:无论我如何尝试,我都无法想出任何可行的方法。到目前为止,我最接近的方法是使用以下代码定义命令,例如 \¼
\expandafter\def\csname #1\endcsname{#2}
这当然是不够的:)
我该如何让它定义那些新创建的活跃角色?
答案1
\usepackage{newunicodechar}
\newunicodechar{¼}{1/4}
\newunicodechar{«}{<<}
\newunicodechar{—}{---}
答案2
这里的问题是,当用于 时,字符必须已经处于活动状态\def
。#1
但是,参数在其先前的 catcode 中保留相同的字符,并且不会受到 的影响\catcode
。有一个使用技巧\lowercase
,但我不确定它是否适用于普通 LaTeX 中的非 ASCII 字符。
您可以使用\scantokens
(现代 LaTeX 版本中可用的 eTeX 扩展)重新读取当前 catcode 下的标记:
\def\subst#1#2{%
\catcode`#1=\active
\scantokens{\def#1}{#2}%
}
在这种情况下,您甚至不需要读取第二个参数,因为\def
它会为您完成:
\def\subst#1{%
\catcode`#1=\active
\scantokens{\def#1}%
}