定义新的中缀命令

定义新的中缀命令

这种问题在这里已经存在了:如何编写中缀宏/新命令?

但我不是在寻找使用中缀命令进行除法的方法,我知道已经存在一个命令。我正在寻找一种方法来定义一个新的二进制中缀命令任何目的。类似

\infixnewcommand{\T}{{bunchofstuff} {#1} {bunchofstuff} {#2} {bunchofstuff}}

然后在代码中稍后{2 z \T 3 y}会被替换为{{bunchofstuff} {2 z} {bunchofstuff} {3 y} {bunchofstuff}}

此外,wobsite 不允许我对另一个问题发表评论,称我没有声誉,所以我被迫开始一个新问题,至少在我有足够的声誉来发表评论之前。对此深表歉意 :D

我面临的具体示例是定义 tfrac,但作为中缀,所以我猜应该是 tover。但需要说明的是,我对涉及已定义 tover 的现有包的“解决方案”不感兴趣。tover 只是手头当前的示例。我感兴趣的是了解如何可以在我自己的代码中定义这样的命令,因为我可以很容易地看到我将来需要这种能力。

答案1

TeX 严格按照标记进入扫描仪的顺序对其进行处理。当一个标记电视要检查的标记是可扩展的,TeX 会对其进行扩展以查找其参数(不进行扩展)。如果标记电视\expandafter是一个宏,它和它的参数将被替换文本替换;否则它在执行其操作后就会消失(这是,\noexpand以及所有条件,包括\else和 的情况\fi)。

如果电视无法扩展,它会被送入喉咙执行。在某些特定情况下,这可以复活主令牌列表中的令牌(这是\lowercase和的情况\uppercase)。

因此,没有办法定义一个“中缀宏”来检查它之前的内容,因为它之前的内容已经被扩展或执行;无论哪种情况,标记都已消失并且不再可用。

\over相关原语的情况(\overwithdelims\atop\atopwithdelims非常不同。它们不是宏,也不可扩展,因此,如前所述,它们是执行。和其他的执行\over包括将当前正在构建的数学列表放在一边,开始一个新的列表,完成后将其放在另一个特殊位置;然后使用两个保存的列表形成一个“分数原子”作为分子和分母。为案例添加分隔符,withdelims并为案例设置分数线over

如您所见,这里不涉及宏扩展(当然,在形成两个数学列表时是这样的,但这无关紧要)。这个过程利用了 TeX 在数学模式下知道它正在处理的数学列表这一事实;然而,这对用户来说是不可用的(LuaTeX 可能知道,但这是另一回事)。

您可以使用特殊分隔符而不是{and来伪造中缀表示法},但此时两个参数的宏似乎更实用,其\frac工作方式类似。

答案2

重要的: 看https://tex.stackexchange.com/a/638830/250119(以及下面 egreg 的评论)解释代码的作用(基本上做了一个正则表达式搜索和替换基于 TeX 代码),它的局限性是什么,以决定是否要使用它。


源代码:

%! TEX program = lualatex
\documentclass{article}
\usepackage{rewriterest}
\begin{document}

\newcommand\Tprefix[2]{{bunchofstuff} #1 {bunchofstuff} #2 {bunchofstuff}}

\ExplSyntaxOn
\rewriterest:n {
    \regex_replace_all:nnN {
        \{
            (    [^\{\}]*    )  % group 1: content does not contain any { or }
            \\T\b
            (    [^\{\}]*    )  % group 1: content does not contain any { or }
        \}
    } {
        \\Tprefix   % we're doing textual substitution here, so no \c{Tprefix}
            \{ \1 \}
            \{ \2 \}
    } \RWRbody
}
\ExplSyntaxOff

test: {2 x \T 3 y}

\end{document}

输出:正如您所期望的。

你需要一个包,目前它的源代码位于https://github.com/user202729/TeXlib

相关内容