1
我使用lua來做一些複雜的工作來爲Tex/LaTex中的宏準備參數。lua中構建乳膠/ Tex參數
第一部分 這是一個愚蠢的小例子:
\newcommand{\test}{\luaexec{tex.print("11,12")}}% aim to create 11,12
\def\compare#1,#2.{\ifthenelse{#1<#2}{less}{more}}
\string\compare11,12. : \compare11,12.\\ %answer is less
\string\test : \test\\ % answer is 11,12
\string\compare : \compare\test. % generate an error
最後一行創建了一個錯誤。顯然,Tex沒有檢測到\ test中包含的「,」。
我該怎麼做才能讓\ test被理解爲11後面跟着12,而不是字符串11,12,並最終用作\ compare的正確形式參數?
感謝egreg指出我的兩個錯誤,我總結如下: - 因爲Tex在查找參數時不擴展,所以我必須使用\ expandafter進行所需的擴展(此處擴展\ test) - 由於\ luaexec不可擴展,我需要使用\ directlua可擴展 我想edef是完全擴展\ test所必需的,因爲\ expandafter只擴展一次。爲了檢查我的理解,我還可以使用幾個\ expandafter只是一個正常的\ def,對不對? 有了這些修改,它工作正常!謝謝 !我會盡力將其轉移到真實的案例中。 – user1771398
要明確難點:誤導的一點是\ testA定義爲\ def \ test {\ directlua {tex。sprint(「11,12」)}}和\ testB定義爲\ edef \ test {\ directlua {tex.sprint(「11,12」)}}給出一個使用\ testA和\ testB的宏,他們無限期地擴大。在一個宏中,它不是一樣的,因爲沒有擴展。當用\ expandafter擴展時,由於只有一個擴展,所以差異依然存在。通過使用\\\\\\\\\\\\\\\\\ \\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\ – user1771398
@ user1771398是的,很好的分析。 '\ expandafter'的問題是你必須精確知道你需要多少擴展步驟。例如,'\ def \ test {\ directlua {...}}'需要兩個,但其他構造可能需要三個或更多。 – egreg