2014-11-02 171 views
2

我經常使用mathematica軟件並使用TeXForm命令在計算和我排版的latex文檔之間來回切換。然而,mathematica不允許我用下劃線定義變量,這在我的latex文檔中經常需要。有人知道如何在mathematica中用「更聰明」的名字創建變量嗎? 從更廣泛的意義上講,整合使用mathematica和latex的最佳方式是什麼? 謝謝。Mathematica和Latex

+0

考慮使用某種形式的[CamelCase](http://en.wikipedia.org/wiki/CamelCase)... – Werner 2014-11-02 18:57:26

+1

我總是通過編寫自己的函數來定製TeX輸出,該函數接受TeXForm的輸出並運行一些字符串替換規則。我不認爲這是值得去比這更聰明的 – Simon 2014-11-02 20:05:17

+0

我怎麼寫這樣的功能?你能分享一個示例代碼嗎? – user191919 2014-11-02 20:06:38

回答

1

首先,Mathematica允許您使用下劃線定義變量。

Subscript[x, 1] = 3 

這個IST [CTR]快捷+ [_]

如果轉換與TeXForm標變量,你會得到:

x_1 

我寧願不使用標準變量的下標表示法,因爲您無法輕易看到變量是否已在此記法中創建了一個值。所以,你可能只寫

x1 

我們現在想這些類型的變量名稱的變換而TeXForm下標符號。 執行此操作的一種方法是使用StringPattern

1.Transform你的表達在TeXForm一個字符串:

In[360]:= ToString[(-b+y1) ((b-y1)/(b-y2))^(-(w10/(x\[Gamma]1-\[Omega]2))), TeXForm] 
Out[360]= (\text{y1}-b) \left(\frac{b-\text{y1}}{b-\text{y2}}\right)^{-\frac{\text{w10}}{\text{x$\gamma $1}-\text{$\omega $2}}} 

2.Replace這一特定字符串模式,以乳膠標符號:

In[361]:= StringReplace[%, "\\text{"~~name_?LetterQ~~index_?DigitQ~~"}":> name<>"_"<>index] 

Out[361]= (y_1-b) \left(\frac{b-y_1}{b-y_2}\right)^{-\frac{\text{w10}}{\text{x$\gamma $1}-\text{$\omega $2}}} 

您可能已經注意到,這替換隻是在由一個字母和一個數字組成的變量名稱上工作。較長的變量名稱將被忽略。這是因爲StringPattern「_」僅代表ohne字符,對於一系列字符,請使用「__」,但我們必須確保符合最可能的順序。爲了趕上較長的變量名,我們應用另一個字符串替換:

In[362]:= StringReplace[%, 
"\\text{"~~Shortest[name__]~~Shortest[index__?DigitQ]~~"}":> "\\text{"<>name<>"}_{"<>index<>"}"] 
Out[362]= (y_1-b) \left(\frac{b-y_1}{b-y_2}\right)^{-\frac{\text{w}_{10}}{\text{x$\gamma $}_{1}-\text{$\omega $}_{2}}} 

現在所有的變量似乎是正確的乳膠符號的下標變量。但是由於內部是單個字母或數字,因此一些「\ text {}」和「{}」現在都是obsolet。 爲了優化LaTeX的代碼,我們可以添加更多的repacements:

In[371]:= StringReplace[%, "{" ~~ i_?DigitQ ~~ "}" :> i]; 
StringReplace[%, "\\text{" ~~ name_?LetterQ ~~ "}" :> name] 

Out[372]= (y_1-b) \left(\frac{b-y_1}{b-y_2}\right)^{-\frac{w_{10}}{\text{x$\gamma $}_1-\text{$\omega $}_2}} 

現在我認爲你的TeX看起來不夠好,所以我們可以定義做了所有替代一步到位的函數:

In[506]:= 
ClearAll[myTeXForm] 
SetAttributes[myTeXForm, HoldFirst] 

myTeXForm[expr_] := Fold[StringReplace, ToString[HoldPattern[expr], TeXForm], 
{"\\text{HoldPattern}\\left[" ~~ str__ ~~ "\\right]" ~~ EndOfString :> str, 
    "\\text{" ~~ Shortest[str__] ~~ Shortest[i__?DigitQ] ~~ "}" :> 
    "\\text{" <> str <> "}_{" <> i <> "}", 
    {"{" ~~ i_?DigitQ ~~ "}" :> i, "\\text{" ~~ s_?LetterQ ~~ "}" :> s}}] 

測試功能:

b=134; 
myTeXForm[(-b+y1) ((b-y1)/(b-y2))^(-(w10/(x\[Gamma]13-\[Omega]2)))] 
Out[510]= (y_1-b) \left(\frac{b-y_1}{b-y_2}\right)^{-\frac{w_{10}}{\text{x$\gamma $}_{13}-\text{$\omega $}_2}} 

請注意,我用一個小技巧來保護函數agains其參數值。在這個例子中,變量b已經是134的值,但是在TeX Output中它仍然應該是「b」。爲此,我將Attribut HoldFirst添加到了我們的函數中,並在裏面使用了HoldPattern。也許可以做到這一點更容易,但它工作正常。

希望這可能會激勵你。 此致敬禮。