
這個問題已經存在於此:如何寫中綴巨集/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