><a href="http://www-900.ibm.com/developerWorks/cn/java/j-jspmath/index.shtml#author1" target="_blank" ><FONT color=#000000>Michael Juntao Yuan</FONT></A><A herf="mailtjuntao@astro.as.utexas.edu">juntao@astro.as.utexas.edu</A>)! G/ C1 C5 M8 F! {& F
>因特网和 Web 最初是由科学家设计用来交换科学和数学研究信息的。出乎意料的是,经过因特网 30 多年的发展以及 Web 10 年的发展,仍然没有一种简便的方法将数学密集型内容发布到 Web 上。已经开发了 Web 数学通信标准,例如 W3C 的 MathML 建议;但是为了使用它们,数学内容的作者和读者都需要特定软件,比如用于 Netscape Navigator 和 Internet Explorer 的 IBM techexplorer 数学浏览器插件。(请参阅<a href="http://www-900.ibm.com/developerWorks/cn/java/j-jspmath/index.shtml#resources" target="_blank" ><FONT color=#000000>参考资料</FONT></A>以获取到 TechExplorer 和 MathML 的链接。)由于技术困难、成本和安全性危险因素,用户不太愿安装特定客户机端软件。因此,使那些标准的采用被限制在狭窄的研究领域,并且广大因特网用户无法使用它们。当前在 Web 上共享数学信息最方便的方法仍是将所有非文本公式转换成快照图像,然后将那些图像插入标准 HTML 页面。</P>4 P: w! j7 X* p/ b) m d
>最新的基于 GUI 的数学权威性工具具有将文档保存为“Web 页面”的选项;这些工具为您生成公式图像和静态 HTML 页面。如果您只是想在 Web 上发布静态内容,例如论文,则这种方法是很方便的。但是,静态网站的时代已经早就过去了,因为在大多数网站中用户的参与已经变得不可缺少。高级数学网站应该从后台数据库中动态地发布内容并允许用户提交他们自己的内容以与其他用户分享(示例包括交互式考试系统和研究协作系统)。</P>
>本文将向您展示该问题的一种解决方案。样本代码提供了一种方法,它可以快速简便地将表示数学公式的标记文本转换成显示该公式的可用于 Web 的图形文件。在此过程中,您会看到解决更多一般性难题的方法:我们将使用 JSP 页面和定制标记将几个完全不同的且互不相连的工具链接在单个程序中。当您使用多变的动态 Web 应用程序时,请记住不必从头做起;解决方案也可以其它形式提供,这由您控制。</P>
><A>JSP 技术回顾</A>' H: v0 _) Y& U# f5 C5 Y
>JSP 技术的主要优点是可扩展性。可以使用定制标记来扩展 JSP 标记语言,它允许我们封装在标记处理器类内部处理显示逻辑的 Java 代码。Web 编写者可以直接使用预定义的标记库完成复杂的显示任务,而不需要编写任何 Java 代码。定制标记使重用显示控制码成为可能,并且极大地简化了 Web 页面编写者的工作。常用的 JSP 定制标记类型是<I>内容转换</I>标记,它将包含在标记主体内对编写者友好的内容转换成对访问者友好的显示元素。</P>3 X) c9 c) X$ p
>对于数学网站,可以使用内容转换标记将数学语义表示转换成 Web 图像。我们将在接下来的几节中更详细地讨论这一技术。</P>
><A>预备知识</A># \/ B/ R& P! q5 m% W+ g& H" X
><A>LaTeX 简介</A>
RE><CODE> \alpha_0^2 + \beta_0^2 = \gamma_0^2 </CODE></PRE></TD></TR></TABLE>' u) H& u* W7 V0 B8 P
>通过 LaTeX 处理后生成图 1 中显示的公式。
><A><B>图 1. 样本 LaTeX 输出</B></A><IMG src="http://www-900.ibm.com/developerWorks/cn/java/j-jspmath/fig01.gif"></P>
><A><B>图 2. 使用 LaTeX 呈现的麦克斯威尔方程组</B></A><IMG src="http://www-900.ibm.com/developerWorks/cn/java/j-jspmath/fig02.gif"></P></LI></UL>
>在继续阅读本文之前,如果对 LaTeX 及其语法感到陌生,最好熟悉一下。在下面的<a href="http://www-900.ibm.com/developerWorks/cn/java/j-jspmath/index.shtml#resources" target="_blank" ><FONT color=#000000>参考资料</FONT></A>一节中包含了到有用信息的链接。</P>
><A>从 LaTeX 中生成 GIF 图像</A>
><A><B>图 3. 运行 LaTeX</B></A><IMG src="http://www-900.ibm.com/developerWorks/cn/java/j-jspmath/fig03.gif"></P>8 v1 J9 w9 d4 B, P! e
><A><B>图 4. 运行 Dvips</B></A><IMG src="http://www-900.ibm.com/developerWorks/cn/java/j-jspmath/fig04.gif"></P>7 i! I% h: E" |4 C# ^! C3 _
><A><B>图 5. 运行 ImageMagick</B></A><IMG src="http://www-900.ibm.com/developerWorks/cn/java/j-jspmath/fig05.gif"></P>2 [* Y8 b8 e6 A% U/ s2 E
><A>在 Java 应用程序中运行外部程序</A>
>. G4 y5 `; t$ }, {
RE><CODE>
rocess p = Runtime.getRuntime().exec(cmd, envp, dir); </CODE></PRE></TD></TR></TABLE></P>5 _. M$ z( T6 E5 N& k, n: w
>其中,参数 <CODE>cmd</CODE> 不是包含命令的单个字符串就是包含命令及其选项的字符串数组;字符串数组 <CODE>envp</CODE> 包含 <CODE>name=value</CODE> 格式的环境变量设置;参数 <CODE>dir</CODE> 是 <CODE>java.io.File</CODE> 类型并且它表示进程的工作目录。进程启动后,我们就可以将数据通过进程的输入流发送给它。</P>) z* Y4 y$ U( c% j1 l/ D
>
RE><CODE>InputStream ins = p.getInputStream();</CODE></PRE></TD></TR></TABLE></P>3 t& N5 F% T4 W
>我们还可以从进程的输出流中获取其输出:</P>
>
RE><CODE>OutputStream ous = p.getOutputStream();</CODE></PRE></TD></TR></TABLE></P>5 @- y. C& m2 P) T5 s7 F8 \. Z
>如果想暂停 Java 应用程序直到完成外部进程为止,可以使用下列代码:</P>
>! ` ~5 U# x* Y7 `2 p3 H
atexMath height="<%=height%>" width="<%=width%>"> <%=mathText%></SlowMathTag
atexMath><p><font color=green> Math formula in default dimensions: </font><p><SlowMathTag
atexMath> <%=mathText%></SlowMathTag
atexMath><p><font color=green> Latex segment in default dimensions: </font><p><SlowMathTag
atexRaw> <%=rawMathText%></SlowMathTag
atexRaw></body></html></CODE></PRE></TD></TR></TABLE></P>9 t( N$ x/ N0 L! L9 S5 T
atexMath></CODE> 标记需要为每个访问者两次生成相同的公式图像,只是为了用不同的尺寸来显示它。现实世界中,应用程序很可能比示例应用程序复杂得多,并且生成不必要的图像带来的性能开销可能很严重。想象一下,我们的站点将提供动态数学考试,并且许多访问者会遇到相同的考试题目。为每个访问者一次次地重新生成同一公式的图像太昂贵了。</P>4 J3 @$ S3 O* W| 欢迎光临 数学建模社区-数学中国 (http://www.madio.net/) | Powered by Discuz! X2.5 |