让用户在你的 Web 和桌面应用中编写数学方程
本文向您展示如何在流行的 TeX 格式中让用户输入数学公式,并在您的 Web 和桌面应用程序中以 GIF 图像形式渲染它们,只需花费 10 分钟的编码工作。

引言
如果您拥有博客、论坛或 Wiki 等应用程序,并努力在每次新版本发布时都能让您的客户满意,那么您可能不需要为这项功能辩护。在本文中,我将向您展示如何让用户输入数学公式,并以精美的教科书格式渲染它们,而您只需付出极少的编码努力。
基本思路是让用户输入类似这样的内容:<img src=".?$ x^2 = 25 $">
上面的请求首先到达您的default.aspx文件,其中一行代码会检测它是否是图像请求,然后将其传输到处理程序。该处理程序使用 MimeTeX 来生成公式的 GIF 文件并返回给浏览器。幸运的是,您不必关心这些,因为所有内容都已打包好,可供拖放使用。
如果您负责任何此类应用程序,您欠您的用户一个让他们拥有此功能。
- 博客
- 论坛
- Wiki
- 电子邮件应用程序
- 即时消息
- HTML 编辑器
- 文字处理
本质上,任何最终以图形形式呈现用户内容的应用程序都可以添加此功能。它不一定是 HTML 内容。例如,笔记软件可以在编辑过程中检测到由$
标记包围的 TeX 内容,并将其替换为精美的图形格式。它可以为此目的使用本文提供的完全相同的库。
提示如何在没有任何编码甚至没有自己的服务器的情况下显示公式?如果您不想部署和维护本文中的代码,可以免费使用我的服务器。您也可以将其用于任何不支持 TeX 和数学公式的博客、Wiki 或网站。 要使用我的服务器,请在您想要的公式前加上
|
背景
MimeTeX是这个代码的核心。MimeTeX 由 John Forkosh 编写,主要用于在 UNIX 下运行,并在 Windows 下作为 CGI EXE 运行。显然,虽然这可行,但它有很多缺点,例如您必须能够通过 IIS 运行 CGI EXE,这对于共享 IIS 主机来说是一个困难的功能。即使您有专用服务器,如果您想支持数千用户,CGI EXE 解决方案也无法扩展。此外,用户还需要将mimetex.exe添加到图像标签的源中,这对于博客或论坛等应用程序的用户来说不够直观。
因此,我决定将 MimeTeX 代码转换为 Win32 DLL。这是一个相当简单的任务,需要获取 C 文件,创建一个 VC++ Win32 DLL 项目,添加 DLL 导出并进行其他小改动。但更大的问题出现在后面:DLL 在进程内运行,因此我们必须确保 C 代码没有内存泄漏。不幸的是,情况并非如此,但幸运的是,诸如_CrtDumpMemoryLeaks
之类的调试函数和 VC++ IDE 使查找它们变得更容易。因此,经过一个周末的努力,这些未知的 UNIX 代码摆脱了所有已知的内存泄漏。在接下来的几周里,John Forkosh 和我交换了长邮件,讨论我所做的 10 行更改,分析它们,完善它们并彻底测试代码。这很有趣。结果是 MimeTeX Win32 DLL,您现在可以使用DLLImport
从 .NET 代码中调用它。
我的下一步是创建一个 ASP.NET IHttpHandler
来封装此调用,在其之上添加缓存,并允许其他自定义和管理功能。
Using the Code
您可以通过三种方式使用此代码
- 集成到您自己的 Web 应用程序中
下载代码,将名为OnlyRequiredFiles的文件夹(对于 VB.NET,请查看 VB.NET Version文件夹)中的文件添加到您的 ASP.NET 项目中,并将MimeTex.DLL放在bin文件夹中。编辑您的default.aspx页面,并将此行放在
Page_Load
或Page_Init
(如果您使用自定义页面模板)的某个位置Astrila.Eq2Img.ShowEq.HandleEquationQueries();
重新编译!确保CachedEqImages文件夹存在,并且 ASP.NET 用户对其具有写权限。就这样!您现在可以在虚拟根文件夹中创建一个 HTML 文件,其中包含一个与本文开头所示示例图像标签相同的图像标签进行测试。
- 作为独立的 Web 应用程序使用
将Eq2Img文件夹复制到您的wwwroot。创建一个虚拟文件夹,确保CachedEqImages文件夹存在,并且 ASP.NET 用户对其具有写权限,并且default.aspx被配置为默认页面。现在您应该可以正常运行了!请记住,您的用户需要在图像标签中引用此虚拟文件夹,如下所示:
<img src="Eq2Img?$ x^2 = 25 $">
- 在桌面应用程序中使用
这非常简单。您只需
DLLImport
MimeTex.DLL并从您的 Windows Forms 应用程序调用CreateGifForEq
函数,如下所示:[System.Runtime.InteropServices.DllImport("MimeTex.dll")] internal static extern int CreateGifFromEq(string expr, string fileName);
您可以在Eq2ImgWinForms文件夹中查看一个示例 Windows Forms 应用程序,它看起来像这样:
下一个问题可能是公式的格式是什么?如何编写希腊符号、积分、极限等等?这种格式称为 TeX(或 LaTeX),如果您在学生时代写过科学文档,您可能对此很熟悉。如果不是,它是一种非常简单的格式。例如,要显示 pi 符号,只需写\pi
,要显示积分符号,只需写\int
,等等。您可以在此处和此处找到很好的文档,但如果您想偷懒,只需使用免费的所见即所得公式编辑器TeXAide,它将为您构建 TeX 字符串。请注意,TeX 会忽略空格。
关注点
您可能已经注意到,MimeTeX 不仅支持符合 TeX 格式的公式。例如,您还可以使用 LaTeX 命令创建复杂的图形,例如以下内容:

这非常酷,因为这项功能允许您的用户仅使用 MimeTeX 编写科学内容。更多示例可以在John 的网站上找到。
我还添加了一些管理功能,让您可以删除缓存文件(这些文件非常小,通常是 1 KB 的 JPG 文件)。您可以通过Eq2ImgAdmin.aspx访问它。此页面还允许您动态**卸载** MimeTeX DLL。请记住,这是一个纯 Win32 DLL,一旦加载,它就会被 ASP.NET 进程锁定,不像托管的 .NET DLL。这意味着您无法在不重启 IIS 的情况下更新 DLL,这对于共享主机或甚至其他情况来说都是一个不幸的场景。为了解决这个问题,管理页面允许您按需动态地从进程中卸载这个非托管 DLL。对于技术好奇者,我只是使用了GetModuleHandle
和FreeLibrary
Windows API 调用。默认情况下,管理功能未启用。按照它显示的说明来启用它。另请注意,您可以完全排除此页面,而不会丢失核心功能。
代码支持一堆自定义设置,您可以将其放入web.config中。默认情况下,不需要任何设置,但如果您愿意,例如,您可以选择让 MimeTeX 在进程外运行而不是在进程内运行,**或者**您可以将其作为 CGI 或从外部 URL 运行。您可以设置公式字符串的最大长度、最大缓存大小和缓存文件夹等。我没有足够的时间来记录它们,但它们很容易从Eq2ImgSettings
类中找出,并且它们都采用以下形式:
<appSettings>
<add key="Eq2Img_ClientCacheAgeInSeconds" value="200" />
</appSettings>
最后,这是您一直等待的安全披露:当您调用 MimeTeX DLL 时,您正在从 ASP.NET 运行非托管代码。这意味着 ASP.NET 应该为此拥有足够的权限(默认情况下它拥有)。但是,更大的担忧是可能的糟糕 C 错误,例如内存泄漏和无效指针,这可能会使您的网站不稳定。在我的测试中,它运行得令人满意;进程内模式具有很高的可扩展性,MimeTeX 本身自 2002 年以来已在许多网站上使用。但是,如果您遇到问题,您有一个退出策略,可以在web.config文件中设置一个选项,以便 MimeTeX 在进程外运行,甚至完全禁用它并仅提供缓存文件。由于 MimeTeX 是一个开源项目,任何人都有权在发现错误后立即修复它们。
需要帮助?
我热衷于让 Web 能够让用户编写科学内容。如果您在使用此代码在您的应用程序中时遇到任何问题,您可以联系我寻求免费帮助。
历史
- 2005 年 8 月 23 日 - 新创建。
- 2005 年 8 月 24 日 - 修复了并发 bug,创建了 VB.NET 版本代码。
- 2008 年 1 月 30 日 - 更新了文章内容