【问题标题】:Mathematica and Latex数学和乳胶
【发布时间】:2014-12-08 09:44:19
【问题描述】:

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

【问题讨论】:

  • 考虑使用某种形式的CamelCase...
  • 我总是通过编写自己的函数来定制 TeX 输出,该函数接受 TeXForm 的输出并运行一些字符串替换规则。我认为不值得尝试变得比这更聪明
  • 这样的函数怎么写?可以分享一下示例代码吗?

标签: latex wolfram-mathematica


【解决方案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 "_" 仅代表 ohne 字符,对于字符序列,使用 "__",但我们必须确保我们与 Shortest 可能的序列匹配。为了捕捉更长的变量名,我们应用了另一个字符串替换:

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 表示法。但是由于内部的单个字母或数字,一些“\text{}”和“{}”现在已经过时了。 为了优化 LaTeX 代码,我们可以添加更多的替换:

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 输出中它仍应显示为“b”。为此,我将属性 HoldFirst 添加到我们的函数中,并在内部使用了 HoldPattern。也许可以更轻松地做到这一点,但效果很好。

希望这能启发你。 最好的问候。

【讨论】:

    猜你喜欢
    • 2019-08-03
    • 2014-06-20
    • 1970-01-01
    • 2023-03-10
    • 1970-01-01
    • 2014-01-10
    • 2015-07-30
    • 1970-01-01
    相关资源
    最近更新 更多