Unicode 字符的中缀语法

Unicode 字符的中缀语法

Tex(和 XeLaTeX)使用我称之为用户定义宏的前缀语法。例如,宏\newcommand{\identity}[1]{#1}与以宏为前缀的变量一起使用:\identity{vars}。某些宏(是^宏吗?)也可以夹在变量之间使用:a^b。我称之为中缀语法。

如何使用 Unicode 字符(例如 ♤ U+2660 或 ⊗ 或 •)定义自己的中缀宏?我希望能够写出 {a+b}♤{c+d},并且应该将其解释为\mymacro{a+b}{c+d}

邮政说新的中缀宏是不可能的。将 ♤ 定义为不同类型的字符怎么样。我对更改字符类(或类型)了解不多,但我知道这是可能的:字符 @ 在类文件 (.sty) 中的工作方式与在普通 .tex 文件中的工作方式不同。

答案1

问题被标记xetex为不允许使用中缀运算符。但是对于未来的读者来说,答案是使用 LuaLaTeX。这个想法是使用正则表达式编写行回调,用中缀运算符替换前缀宏。

请注意,这种方法相当脆弱,因为它不允许嵌套括号。通过实际处理 tex 标记而不是(有问题的)全能正则表达式,可以使其更加健壮,但这只是概念证明。

\documentclass{article}
\usepackage{luacode}
\usepackage{fontspec}
\setmainfont{DejaVu Serif}
\begin{luacode}
    function translate(line)
        return string.gsub(line, "{(.*)}♤{(.*)}", "\\mymacro{%1}{%2}")
    end
    luatexbase.add_to_callback("process_input_buffer", translate, "infix")
\end{luacode}
\let\mymacro\frac
\begin{document}
See the following fraction: ${a+b}♤{c+d}$

Regular club: a ♤ b
\end{document}

结果:

在此处输入图片描述

答案2

你所说的“中缀宏”实际上不是。 的行为^在 TeX 中是固定的(不是字符本身,任何类别代码为 7 的字符都会以完全相同的方式表现);对于_(实际上,类别代码为 8)也是如此。

有“中缀命令”,例如\over\overwithdelims,但它们不是宏:它们是不可扩展的原语。

上述标记的工作方式深深地基于 TeX 的数学模式,其中输入会发生非常不同的事情。事实上,数学列表是通过将发现的对象分类为原子各种类型;一个原子有三个领域:原子核,下标和上标,每个领域本身都可以是一个数学列表。

它是如何\over工作的?首先,我们注意到一个“单独的” {(不用于分隔宏参数的)或\left开始一个新的数学列表,该列表稍后将插入到外部数学列表中。

现在,当 TeX 找到时\over,它会将找到的内容存储在当前数学列表(可能是主数学列表)中,开始一个新的数学列表,直到匹配的}\right(或数学模式的结束),然后采用两个这样构建的数学列表并形成一个 Frac 原子。

不能可以通过宏重现:这是一种内置行为(在我看来,这是 TeX 的缺陷之一)。

你提议的运算符如何确定什么是“左部分”和“右部分”? 类似的东西\over,因为它的行为是内置在 TeX 中的,它有具体的它的处理规则。


脚注。 的语法\over是为了反映分数的朗读方式。但“x 加一除以 x 加二”是什么意思呢?它是否对应于

\frac{x+1}{x+2}

或者

x+\frac{1}{x}+2

或者其他什么东西?

答案3

我为此编写了一个包。目前源代码位于https://github.com/user202729/TeXlib(尚未发布到 CTAN);但不幸的是,几乎没有文档,就像大多数用 TeX 实现的东西一样,很慢

\documentclass{article}
\usepackage{rewriterest}      % ← this package!
\usepackage{newunicodechar}   % pdflatex does not have spade suit

\newunicodechar{♤}{\ensuremath{\spadesuit}}

\begin{document}

\ExplSyntaxOn
\rewriterest:n {
    \regex_replace_all:nnN {
        (    \{ [^\{\}]* \}    )  % group 1: {...}, content does not contain any { or }
        ♤                         % the club
        (    \{ [^\{\}]* \}    )  % group 2: same as group 1
    } {
        \\frac   % we're doing textual substitution here, so no \c{frac}
            \1
            \2
    } \RWRbody
}
\ExplSyntaxOff

See the following fraction: ${a+b}♤{c+d}$

Regular club: a ♤ b
\end{document}

它的工作原理是捕获文件剩余部分的内容,然后对其进行一些正则表达式替换,然后执行结果。

相关内容