小白问Yasnippet上怎么实现UltiSnips直接求积分的功能

sympy-8c8f143fdcdc2f3e6de9853cf7ea3def

下面是 UltiSnips的代码,可能并没有帮助。。

snippet sympy "sympy block " w sympy $1 sympy$0
endsnippet

priority 10000
snippet 'sympy(.*)sympy' "evaluate sympy" wr
`!p
from sympy import *
x, y, z, t = symbols('x y z t')
k, m, n = symbols('k m n', integer=True)
f, g, h = symbols('f g h', cls=Function)
init_printing()
snip.rv = eval('latex(' + match.group(1).replace('\\', '') \
    .replace('^', '**') \
    .replace('{', '(') \
    .replace('}', ')') + ')')
`
endsnippet
2 个赞

详细解释下你想要的功能?

我猜的

  1. 用户输入一个 公式 比如说图片中的 integrate(tan(x),x)

  2. 自动求公式的值? 这里的结果和楼主的不一样

                  2
        log(tan(x)  + 1)
        ----------------
                2

3 将所求的“值” 用tex表示出来

\frac{{\log \left( {{{{\tan \left( {x} \right)}^2}+1}} \right)}}{2}

楼主用的是python的sympy 会用python和elisp应该能弄

你好。我想要在spacemacs写latex时如果临时用到某个函数的积分,那我可以直接用yasnippet像gif 中快速得到结果, 而不用去专门的数学软件, 同时也省去了写数学公式的时间.

elisp 刚入门,不是很熟悉,那请问怎么写yasnippet 呢?我想要我在spacemacs写latex时如果临时用到某个函数的积分,那我可以直接用snippet像gif 中快速得到结果, 而不用去专门的数学软件,也节省了输入公式的时间。

不难搞,首先用这里的方法以emacs lisp展开snippet,然后用shell-command-to-string呼叫python得到结果就行了。

Emacs 内置的 calc 就能求积分 ;并且可以输出为 LaTeX 格式。用 yasnippet 简单包装一下:

# -*- mode: snippet -*-
# name: calc-integ
# key: integ
# type: command
# --

(require 'calc-lang)
(defun calc-integ (exp)
  (interactive "sExp: ")
  (calc-latex-language nil)
  (calc-radians-mode)
  (insert
  (calc-eval
   (concat "integ(" ;; 调用求积分的函数,可以换成求微分的
           exp
           ")"))))
(call-interactively 'calc-integ)

效果如下:

calc-integ

类似的可以定义求微分、解方程等。这算是一个撮合但比较简单的解决方案了。

PS:刚发现这个方法有个 BUG,需要先运行一下 calc 才能有效……果然是非常撮合了。

PPS:calc 有一个 embedded mode 可以自动计算 LaTeX 中的公式,现在看来是更加方便方法:它可以连续对一个表达式进行积分。具体方法如下:

使用快捷键 C-c * e 激活 embedded mode 后,将光标停留在公式上按快捷键 a i ,输入积分变量,就能对光标下公式求积分了。效果如图:

clac-initg2

4 个赞

改成(require 'calc)就好了

基于楼上的代码稍作修改

(defun cm/calc-int (exp)
  (require 'calc)
  (require 'calc-lang)
  (ignore-errors
    (calc-create-buffer)
    (calc-radians-mode)
    (calc-latex-language nil)
    (calc-eval
     (concat "integ("
             exp
             ")"))))
# -*- mode: snippet -*-
# name: doint
# key: doint
# --
${1:Enter Your Formula here$(when yas-moving-away-p (cm/calc-int yas-text))}$0

%E6%B7%B1%E5%BA%A6%E5%BD%95%E5%B1%8F_emacs_20190325194557

4 个赞

人家是要python的

你又开始了,上次脸不够疼?

1 个赞

太炫酷了,从来没想过这种用法

非常感谢。有个小问题,请问你是把defun 那部分也放在snippet 里面吗?我放在里面,输doint 展开时, 会有defun 部分的text. 请问怎么能隐藏defun呢?

defun可以写在配置文件里

我对sympy这个库不太熟,不过思路是类似的。你可一查查怎么用elisp调用shell command,然后调用python来获取sympy的输出

一般来说是的,如果你用别人的配置,那就得看别人的文档了

这个配置文件指init.el?

你没有发现这个和yas没什么关系吗?

如果真有关系也是在输入int之后,补全integrate及括号。

latex之前的步骤去哪里了?一定非得编译一下才看的出来吗?

我若想在latex之前和之后切换怎么办呢?

还有就是numpy很费时,用shell命令还不如用个进程或是jupyter。

标题就是要yas。我能怎么办?像某些人一样又用其他乱七八糟的东西做个半成品然后和既有工作流接不上?

latex之前的步骤你可以去看calc的源码。甚么编译?elisp可以解释执行。想一步步摸的用edebug。自己想表达什么都没描述清楚

这关楼主锤子事,更不关我锤子事。可以善意探讨,请不要颐指气使。

楼主想用的是sympy,你这么关心人家还改成用numpy?那你很勇哦

那就不如老老实实用个calc,哪来那么多废话


就这样吧,下次再遇到你对我玩这种自作聪明越庖代俎的把戏,我不保证你能有尊严的离开

2 个赞

谢谢,你的回答对我很有帮助。

这个calc的方法不错,但是如果坚持用sympy的话可以和lpy一起用也能达到这个效果,不需要另外写函数

1 个赞