Mathematica和Latex

时间:2014-11-02 16:52:43

标签: latex wolfram-mathematica

我一直在使用mathematica软件并使用TeXForm命令在计算和我正在排版的乳胶文件之间来回切换。但是,mathematica不允许我用下划线定义变量,这在我的乳胶文档中经常需要。有人知道如何在mathematica中创建具有“更智能”名称的变量吗? 从广义上讲,整合mathematica和latex的最佳方法是什么? 感谢。

1 个答案:

答案 0 :(得分:1)

首先,Mathematica允许您使用下划线定义变量。

Subscript[x, 1] = 3

此ist [ctr] + [_]

的快捷方式

如果使用TeXForm转换下标变量,您将获得:

x_1

我更喜欢不对正常变量使用下标表示法,因为您无法轻易查看变量是否已在此表示法中具有值。所以你可能只写

x1

我们现在想要将这些变量名称转换为TeXForm中的下标符号。 一种方法是使用 StringPattern

1.将表达式转换为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.将此特定字符串模式替换为LaTeX的下标符号:

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&#34; _&#34;只代表一个字符,对于一系列字符,使用&#34; __&#34;,但我们必须使shure,我们匹配最短可能的序列。为了捕获较长的变量名,我们应用另一个字符串替换:

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}}}

现在所有变量看起来都是正确的LaTeX表示法,用于下标变量。但是现在由于单个字母或数字,一些&#34; \ text {}&#34; s和#34; {}&#34; s是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}}

请注意,我使用了一个小技巧来再次保护函数的参数值。在这个例子中,变量b已经具有值134,但是在TeX输出中,它应该仍然是a&#34; b&#34;。为此,我将Attribut HoldFirst添加到我们的函数中并在其中使用了HoldPattern。也许一个人可以做到这一点更容易,但它运作正常。

希望这可能会激励你。 最好的问候。