定義新的中綴指令

定義新的中綴指令

這個問題已經存在於此:如何寫中綴巨集/new指令?

但我並不是在尋找一種使用中綴指令進行除法的方法,我知道已經存在一個指令。我正在尋找一種方法來定義新的二進位中綴命令任何目的。就像是

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

然後在代碼中,{2 z \T 3 y}將被替換為{{bunchofstuff} {2 z} {bunchofstuff} {3 y} {bunchofstuff}}.

另外,wobsite 不允許我評論另一個問題,說我沒有代表,所以我被迫開始一個新問題,至少在我有足夠的代表發表評論之前。對此感到抱歉:D

我面臨的特定範例是定義 tfrac,但作為中綴,所以我想它會結束。但要明確的是,我對涉及定義 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

相關內容