C#开发基于Http的LaTeX数学公式转换器
本文将讲解如何通过codecogs.com和Google.com提供的API接口来将LaTeX数学函数表达式转化为图片形式。具体思路如下:
(1)通过TextBox获取用户输入的LaTeX数学表达式,然后对表达式格式化使之便于网络传输。
(2)将格式化之后的字符串,通过Http请求发送至codecogs.com或者Google.com。
(3)获取网站返回的数据流,将其转化为图片,并显示在PictureBox上。
具体过程为:
首先,我们在这个网站输入LaTeX数学公式然后返回图片时,即“http://latex.codecogs.com/gif.latex?“后面跟上我们输入的公式内容。比如”http://latex.codecogs.com/gif.latex?\alpha”就显示一个希腊字母。所以我们可以在其后加上我们希望转换的公式即可。但是需要注意的是,网络URL中的空格有时候会自动转化为加号”+“。所以,我们在传输的时候需要将空格去掉。或者将其转换为”%20“。
建立如图所示的Form。一个TextBox,六个Button和一个PictureBox。
用例为著名的“薛定谔方程”:
i\hbar\frac{\partial \psi}{\partial {t}} = \frac{-\hbar^2}{2m} \left( \frac{\partial^2}{\partial {x^2}} + \frac{\partial^2}{\partial {y^2}} + \frac{\partial^2}{\partial {z^2}} \right) \psi + V \psi
“粘贴文本”按钮添加如下单击事件。
private void btnPasteText_Click(object sender, EventArgs e)
{
string content = Clipboard.GetText(); // 获取剪切板文本信息
textBox.Text = content; // 将信息显示到TextBox
}
private bool check()
{
if(textBox.Text.Trim() == "") // 如果TextBox为空
{
MessageBox.Show(this, "请填写 LaTeX 函数代码!");
return false;
}
return true;
}
“Google预览”按钮添加如下事件。
private void btnPreviewGoogle_Click(object sender, EventArgs e)
{
if (check())
{
// 首先将文本信息格式化,作为URL信息。
string ImgUrl = String.Format(PicUrlGoogle, HttpUtility.UrlPathEncode(textBox.Text));
pictureBox.ImageLocation = ImgUrl; // 加载网络图片到PictureBox
btnCopyImg.Enabled = true; // 使“复制图像”按钮可用
}
else
btnCopyImg.Enabled = false; // 否则使“复制图像”按钮不可用
}
“Cogs预览”按钮添加如下事件。
private void btnPreviewCogs_Click(object sender, EventArgs e)
{
if (check())
{
// 首先将文本信息格式化,作为URL信息。
string ImgUrl = String.Format(PicUrlCogs, HttpUtility.UrlPathEncode(textBox.Text));
pictureBox.ImageLocation = ImgUrl; // 加载网络图片到PictureBox
btnCopyImg.Enabled = true; // 使“复制图像”按钮可用
}
else
btnCopyImg.Enabled = false; // 否则使“复制图像”按钮不可用
}
“复制图像”按钮添加如下单击事件。
private void btnCopyImg_Click(object sender, EventArgs e)
{
if(pictureBox.Image != null)
Clipboard.SetImage(pictureBox.Image); // 将Picture图片复制到剪切板
}
“显示帮助”按钮添加如下事件。
private void btnHelp_Click(object sender, EventArgs e)
{
textBox.Text = "1、LaTex 公式前后无需 $ 符号;\r\n"
+ "2、需要联网,Google丑,Cogs慢;\r\n"
+ "3、尽量多使用 {} 将字段括起来;\r\n"
+ "4、于 2015年11月13日。";
}
“退出”按钮添加如下事件。
private void btnExit_Click(object sender, EventArgs e)
{
System.Environment.Exit(0); // 退出程序
}
完整代码如下:
using System;
using System.Windows.Forms;
using System.Web; namespace LaTeX_Win
{
public partial class Form1 : Form
{
private static string PicUrlGoogle = @"http://chart.apis.google.com/chart?cht=tx&chl={0}";
private static string PicUrlCogs = @"http://latex.codecogs.com/gif.latex?{0}";
public Form1()
{
InitializeComponent();
} private void btnPasteText_Click(object sender, EventArgs e)
{
string content = Clipboard.GetText();
textBox.Text = content;
} private void btnPreviewGoogle_Click(object sender, EventArgs e)
{
if (check())
{
string ImgUrl = String.Format(PicUrlGoogle, HttpUtility.UrlPathEncode(textBox.Text));
pictureBox.ImageLocation = ImgUrl;
btnCopyImg.Enabled = true;
}
else
btnCopyImg.Enabled = false;
}
private void btnPreviewCogs_Click(object sender, EventArgs e)
{
if (check())
{
string ImgUrl = String.Format(PicUrlCogs, HttpUtility.UrlPathEncode(textBox.Text));
pictureBox.ImageLocation = ImgUrl;
btnCopyImg.Enabled = true;
}
else
btnCopyImg.Enabled = false;
}
private void btnCopyImg_Click(object sender, EventArgs e)
{
if(pictureBox.Image != null)
Clipboard.SetImage(pictureBox.Image);
}
private bool check()
{
if(textBox.Text.Trim() == "")
{
MessageBox.Show(this, "请填写 LaTeX 函数代码!");
return false;
}
return true;
} private void btnExit_Click(object sender, EventArgs e)
{
System.Environment.Exit(0);
} private void btnHelp_Click(object sender, EventArgs e)
{
textBox.Text = "1、LaTex 公式前后无需 $ 符号;\r\n"
+ "2、需要联网,Google丑,Cogs慢;\r\n"
+ "3、尽量多使用 {} 将字段括起来;\r\n"
+ "4、于 2015年11月13日。";
}
}
}
C#开发基于Http的LaTeX数学公式转换器的更多相关文章
- Android开发手记(29) 基于Http的LaTeX数学公式转换器
本文将讲解如何通过codecogs.com和Google.com提供的API接口来将LaTeX数学函数表达式转化为图片形式.具体思路如下: (1)通过EditText获取用户输入的LaTeX数学表达式 ...
- Spring7——开发基于注解形式的spring
开发基于注解形式的spring SpringIOC容器的2种形式: (1)xml配置文件:applicationContext.xml; 存bean:<bean> 取bean: Appli ...
- [Intel Edison开发板] 05、Edison开发基于MRAA实现IO控制,特别是UART通信
一.前言 下面是本系列文章的前几篇: [Intel Edison开发板] 01.Edison开发板性能简述 [Intel Edison开发板] 02.Edison开发板入门 [Intel Edison ...
- {VS2010C#}{WinForm}{ActiveX}VS2010C#开发基于WinForm的ActiveX控件
在VS2010中使用C#开发基于WinForm的ActiveX控件 常见的一些ActiveX大部分是使用VB.Delphi.C++开发,使用C#开发ActiveX要解决下面三个问题: 使.NET组件可 ...
- markdown下编辑latex数学公式
在利用为知笔记编写笔记的时候,有时需要用的markdown,只要把文件名加上后缀.md,就可以使用markdown语法,以下介绍在markdown下编辑latex数学公式. 使用LaTeX写公式的基本 ...
- Form_Form Builder开发基于视图页面和自动代码生成包(案例)
2014-01-06 Created By BaoXinjian
- 转】Mahout分步式程序开发 基于物品的协同过滤ItemCF
原博文出自于: http://blog.fens.me/hadoop-mahout-mapreduce-itemcf/ 感谢! Posted: Oct 14, 2013 Tags: Hadoopite ...
- Markdown 添加 Latex 数学公式
添加公式的方法 Latex 数学公式语法 添加公式的方法 行内公式 $行内公式$ 行间公式 $$行间公式$$ Latex 数学公式语法 角标(上下标) 上标命令^{} 下标命令_{} 上下标命令用来放 ...
- 最简单的基于FFMPEG的封装格式转换器(无编解码)
本文介绍一个基于FFMPEG的封装格式转换器.所谓的封装格式转换,就是在AVI,FLV,MKV,MP4这些格式之间转换(相应.avi,.flv,.mkv,.mp4文件).须要注意的是,本程序并不进行视 ...
随机推荐
- java中的信号量Semaphore
Semaphore(信号量)充当了操作系统概念下的“信号量”.它提供了“临界区中可用资源信号量”的相同功能.以一个停车场运作为例.为了简单起见,假设停车场只有三个车位,一开始三个车位都是空的.这时如果 ...
- VC和VS调用Lua设置以及Lua C API使用。
通过c++调用lua 脚本, 环境VC++6.0 lua sdk 5.1.4 在调用前先认识几个函数.1.调用lua_open()将创建一个指向Lua解释器的指针.2. luaL_ope ...
- 正在执行的SQL和之前执行的SQL
SQL> select * from v$mystat where rownum<2; SID STATISTIC# VALUE ---------- ---------- ------- ...
- To enable integrated Windows authentication in Windows Vista/IIS 7
https://msdn.microsoft.com/en-us/library/x8a5axew.aspx Log on to the Web server by using an administ ...
- asterisk错误排查
1.查看某个模块是否被包含在编译选项里了: See menuselect.makeoptsIf you see chan_sip in the MENUSELECT_CHANNELS option, ...
- TCP 的那些事儿(上)
TCP是一个巨复杂的协议,因为他要解决很多问题,而这些问题又带出了很多子问题和阴暗面.所以学习TCP本身是个比较痛苦的过程,但对于学习的过程却能让人有很多收获.关于TCP这个协议的细节,我还是推荐你去 ...
- java 23 种设计模式
一.设计模式的分类 总体来说设计模式分为三大类: 创建型模式,共五种:工厂方法模式.抽象工厂模式.单例模式.建造者模式.原型模式. 结构型模式,共七种:适配器模式.装饰器模式.代理模式.外观模式.桥接 ...
- DUBBO Thread pool is EXHAUSTED!
一.问题 在测试环境遇到的异常信息,如下: 16-10-17 00:00:00.033 [New I/O server worker #1-6] WARN com.alibaba.dubbo.com ...
- bootstrap+jQuery.validate表单校验
谈谈表单校验 这大概是一种惯例,学习前台后台最开始接触的业务都是用户注册和登录.现在社会坚持以人为本的理念,在网站开发过程同样如此.User是我们面对较多的对象,也是较核心的对象.最开始的用户注册和登 ...
- app启动其他应用
因开发需要内包一个app,所以要启动一个app,这种操作 如果知道包名和类名 其实很简单 只需要将包名内嵌即可(一般情况 我们都可以解压或者反接拿到) 代码如下: Intent intent = ne ...