这种问题在这里已经存在了:如何编写中缀宏/新命令?
但我不是在寻找使用中缀命令进行除法的方法,我知道已经存在一个命令。我正在寻找一种方法来定义一个新的二进制中缀命令任何目的。类似
\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