2

我需要删除Mathematica 中\text生成的所有内容。TeXForm

我现在正在做的是这样的:

MyTeXForm[a_]:=StringReplace[ToString[TeXForm[a]], "\\text" -> ""]

但结果保留了大括号,例如: for a=fx,

结果TeXForm[a]\text{fx}

结果MyTeXForm[a]{fx}

但我想要的是它只是fx

4

3 回答 3

2

您应该能够使用字符串模式。基于http://reference.wolfram.com/mathematica/tutorial/StringPatterns.html,类似以下的内容应该可以工作:

MyTeXForm[a_]:=StringReplace[ToString[TeXForm[a]], "\\text{"~~s___~~"}"->s]

我现在手边没有 Mathematica,但这应该说“匹配“\text{”,后跟存储在变量 s 中的零个或多个字符,然后是“}”,然后用存储的任何内容替换所有这些在 s.'

更新:

上述方法适用于存在单个 "\text{...}" 元素的最简单情况,但模式s___是贪婪的,因此在 input 上a+bb+xx+y,Mathematica 的 TeXForm 将其呈现为 "a+\text{bb}+\text{xx }+y",它匹配第一个 "\text{" 和最后一个 "}" 之间的所有内容 --- 所以,"bb}+\text{xx" --- 导致输出

In[1]:= MyTeXForm[a+bb+xx+y]
Out[1]= a+bb}+\text{xx+y

解决此问题的方法是用 包装模式Shortest[],导致第二个定义

In[2]:= MyTeXForm2[a_] := StringReplace[
          ToString[TeXForm[a]],
          Shortest["\\text{" ~~ s___ ~~ "}"] -> s
        ]

产生输出

In[3]:= MyTeXForm2[a+bb+xx+y]
Out[3]= a+bb+xx+y

如预期的。不幸的是,当文本本身包含右括号时,这仍然不起作用。例如,输入f["a}b","c}d"](出于某种原因......)会给出

In[4]:= MyTeXForm2[f["a}b","c}d"]]
Out[4]= f(a$\$b},c$\$d})

而不是 "f(a$\}$b,c$\}$d)",这将是对TeXForm输出 "f(\text{a$\}$b},\text{c$\ }$d})”。

于 2013-08-01T23:12:38.857 回答
0

这是一个非常晚的回复,但我刚刚遇到了同样的问题并发现了一个简单的解决方案。在要使用 TexForm 转换的 Mathematica 表达式中的变量之间放置一个空格。

对于原始海报的示例,以下代码效果很好:

a=f x
TeXForm[a]

输出如所愿:f x

由于 LaTeX 在数学模式下会忽略该空间,因此格式会正确。

(顺便说一句,我在下标中有两个并排变量的下标表达式遇到了同样的问题。在它们之间插入一个空格解决了这个问题。)

于 2022-01-19T21:28:08.640 回答
0

这就是我所做的(对我来说很好):

MyTeXForm[a_] := ToString[ToExpression[StringReplace[ToString[TeXForm[a]], "\\text" -> ""]][[1]]]
于 2018-12-09T02:01:50.840 回答