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