2015-05-04 50 views
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的正確形式參數?

回答

3

對TeX的工作原理有幾種誤解。

您的\compare宏想找到一個後跟一個逗號,然後是一個句點。然而,當你調用

\compare\test 

沒有逗號被發現,所以TeX的不斷尋找,直到找到文件的任何一個結束或\par(或空行以及)。請注意,TeX 從不在查找宏的參數時展開宏。

你可能會做

\expandafter\compare\test. 

提供\test立即擴展到需要的格式標記,然而不這樣做,是因爲\test擴張是

\luaexec{tex.print("11,12")} 

和逗號隱藏由大括號,所以它不算。但它不會幫助。

的問題是一樣的:當你做

\newcommand{\test}{\luaexec{tex.print("11,12")}} 

的說法是不擴大。您可以使用\edef的「擴展定義」,但問題是\luaexec不能完全展開。

如果你

\edef\test{\directlua{tex.sprint("11,12")}} 

然後

\expandafter\compare\test. 

會工作。

+0

感謝egreg指出我的兩個錯誤,我總結如下: - 因爲Tex在查找參數時不擴展,所以我必須使用\ expandafter進行所需的擴展(此處擴展\ test) - 由於\ luaexec不可擴展,我需要使用\ directlua可擴展 我想edef是完全擴展\ test所必需的,因爲\ expandafter只擴展一次。爲了檢查我的理解,我還可以使用幾個\ expandafter只是一個正常的\ def,對不對? 有了這些修改,它工作正常!謝謝 !我會盡力將其轉移到真實的案例中。 – user1771398

+0

要明確難點:誤導的一點是\ testA定義爲\ def \ test {\ directlua {tex。sprint(「11,12」)}}和\ testB定義爲\ edef \ test {\ directlua {tex.sprint(「11,12」)}}給出一個使用\ testA和\ testB的宏,他們無限期地擴大。在一個宏中,它不是一樣的,因爲沒有擴展。當用\ expandafter擴展時,由於只有一個擴展,所以差異依然存在。通過使用\\\\\\\\\\\\\\\\\ \\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\ – user1771398

+0

@ user1771398是的,很好的分析。 '\ expandafter'的問題是你必須精確知道你需要多少擴展步驟。例如,'\ def \ test {\ directlua {...}}'需要兩個,但其他構造可能需要三個或更多。 – egreg