宏以字符作为参数,使其处于活动状态,然后 \def 它。

宏以字符作为参数,使其处于活动状态,然后 \def 它。

我有一个 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}%
}

相关内容