首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >Mathematica和Latex

Mathematica和Latex
EN

Stack Overflow用户
提问于 2014-11-02 16:52:43
回答 1查看 1.2K关注 0票数 2

我经常使用mathematica软件,并使用TeXForm命令在计算和我正在排版的latex文档之间来回往返。然而,mathematica不允许我用下划线来定义变量,在我的latex文档中我经常需要这些变量。有谁知道如何在mathematica中用“更聪明”的名字来创建变量呢?从更广泛的意义上讲,怎样才能更好地整合数学和乳胶的使用呢?谢谢。

EN

回答 1

Stack Overflow用户

发布于 2014-12-08 01:11:18

首先,Mathematica允许您定义带有下划线的变量。

代码语言:javascript
复制
Subscript[x, 1] = 3

此ist ctr+_的快捷方式

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

代码语言:javascript
复制
x_1

我倾向于不对普通变量使用下标表示法,因为您无法很容易地看到变量是否在此表示法中列出了一个值。所以你可以直接写

代码语言:javascript
复制
x1

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

1.将表达式转换为TeXForm中的字符串:

代码语言:javascript
复制
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的下标符号:

代码语言:javascript
复制
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字符,一个字符序列使用"__",但是我们必须使shure与最短的可能序列相匹配。为了捕获较长的变量名,我们应用另一个字符串替换:

代码语言:javascript
复制
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{}”和“{}”现在已经过时了,因为里面只有一个字母或数字。为了优化LaTeX代码,我们可以添加进一步的重拍:

代码语言:javascript
复制
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看起来足够好了,所以我们可以定义一个函数,在一步内完成所有的替换:

代码语言:javascript
复制
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}}]

测试功能:

代码语言:javascript
复制
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输出中,它仍然应该以"b“的形式出现。为此,我将Attribut添加到函数中,并在函数中使用了HoldPattern。也许一个人可以更容易地做到这一点,但它工作得很好。

希望这能激励你。诚挚的问候。

票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/26701860

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档