在您的帮助下,我已经弄清楚了如何用自定义宏替换+
或数学模式:-
我怎样才能让每个出现的“+”和“-”都被宏替换,但仅限于数学模式?
-
现在,我需要通过仅替换二进制(例如x-y
或x - y
)而不是一元-
(例如x + -x
或)来扩展它-z
。因此,在某种意义上,我需要测试 a-
是一元的还是二进制的,这正是 TeX 在计算 周围的间距时所做的-
。
那么 TeX 是如何做到的呢?
答案1
有六种基本原子类型:Ord、Op、Bin、Rel、Open、Close 和 Punct。还有其他原子类型,但就间距而言,它们被视为 Ord 原子类型(Inner 是一个有点特殊的情况)。
如果 Bin 类型的原子没有被包围,则它将变成 Ord两个都两侧原子与其性质相容。下表显示了当 Bin 右侧的原子(此处+
)为 Ord 时会发生什么情况;有 36 种可能的组合,您可以尝试其他 30 种。例如,“Ord Bin Open”是“Close Bin Ord”的对应项,其中 Bin 保持不变,就像在“Close Bin Open”中一样。
\baselineskip=1.2\baselineskip
\halign{#\unskip\hfil &\qquad #\unskip\hfil\cr
$x+a$ & Ord Bin Ord \cr
$\sum+a$ & Op Bin Ord \cr
$++a$ & Bin Bin Ord \cr
$=+a$ & Rel Bin Ord \cr
$(+a$ & Open Bin Ord \cr
$)+a$ & Close Bin Ord \cr
$,+a$ & Punct Bin Ord \cr
}
\bye
用 编译pdftex
。
从图中可以看出,只有在第 1、3 和 6 行中间+
表现得像一个二元运算符,在其他行中它变成了 Ord。
还要注意,尾随的 Bin 将始终被视为 Ord (例如,当您输入时\lim_{x\to0-}
,因为它具有没有什么在它之后,类似于前导,就像在 中一样$-1$
。
这是不是在宏观层面上可用,并在 TeX 解释数学列表以便稍后将其转换为水平列表的深层阶段决定。
答案2
我知道这没有回答问题,但是我的评论太长了。
要使+
或 -
判断它是二进制还是一元的,它必须从它之前的内容中获取信息。1-3
与1^{-3}
或甚至进行比较。你如何在宏级别实现这一点?如果和是宏1\times-3
,这是不可能的。基本上,你需要一个整个数学表达式的解析器。首先,数学模式可能以或或或 或或等结尾......因此你必须寻找类似输入的东西,或者深入研究。当然,像 l3fp 这样的数学引擎知道如何区分一元减号和二进制减号,但你必须为此编写一个完整的解析器,并且它们处理的数学表达式与数学 TeX 可以排版的并不完全相同。因此在宏观层面上,这非常困难,而且不可能仅将和转换为宏。+
-
$
\)
\]
$$
\end{equation}
\end{align}
<start of math>\PARSE{....}<end of math>
$
+
-
TeX 操作的数学列表原子在宏观层面上是不可访问的(我不认为 e-TeX\lastnodetype
有太大帮助)。
然而根据@HenriMenke评论您可以使用 LuaTeX 的回调。