【背景】
收到别人一个邮件,说是在使用Docbook转PDF时,
对于:
<inlineequation>
<m:math display="inline">
<m:mrow>
<m:mrow>
<m:mi>x</m:mi>
<m:mo>+</m:mo>
<m:mi>y</m:mi>
</m:mrow>
<m:mo>=</m:mo>
<m:mn>2</m:mn>
</m:mrow>
</m:math>
</inlineequation> 的Math的公示,Docbook不支持,出现下面的错误:
警告: Unknown formatting object "{http://www.w3.org/1998/Math/MathML}math" encountered (a child of fo:instream-foreign-object}. (No context info available) 警告: Unknown formatting object "{http://www.w3.org/1998/Math/MathML}mrow" encountered (a child of math}. (No context info available) 七月 04, 2014 10:03:11 上午 org.apache.fop.events.LoggingEventListener processEvent 警告: Unknown formatting object "{http://www.w3.org/1998/Math/MathML}mtext" encountered (a child of mrow}. (No context info available) 七月 04, 2014 10:03:11 上午 org.apache.fop.events.LoggingEventListener processEvent 警告: Unknown formatting object "{http://www.w3.org/1998/Math/MathML}mspace" encountered (a child of mrow}. (No context info available) 七月 04, 2014 10:03:11 上午 org.apache.fop.events.LoggingEventListener processEvent |
然后其另外也去试了试:
“在转之前用jeuclid先处理xml文件,把公式转成图片,然后再把公式这段代码直接给替换成图片,然后在转成PDF”
【折腾过程】
1.然后去搜了很多相关的资料:
The DocBook MathML Document Type
http://docbook.org/xml/mathml/1.0/dbmathml.dtd
-》
W3C MathML implementations page
W3C MathML implementations page
lf201, Applications: 编辑DocBook XML文档
-》》》》
发现:
http://www.w3.org/1998/Math/MathML/
是可以打开的->有效的namespace
而
http://www.sagehill.net/docbookxsl/MathML.html
->
http://www.w3.org/Math/DTD/mathml2
是打不开的
->无效的namespace?
但是:
是
是可以打开的。
对应的有:
http://www.w3.org/Math/DTD/mathml3/mathml3.dtd
和:
http://www.w3.org/Math/DTD/mathml2/mathml2.dtd
2.此处再去对于上述用到的namespace:
http://www.w3.org/1998/Math/MathML/
确认是可以打开的:
3.去搜了搜:
jeuclid
找到:
发现是:
一个工具,可以讲mathml转换为图片的。
4.所以,此刻就是去自己试试,自己此处是否可以正常工作:
不过现在搜索:
Unknown formatting object MathML math encountered a child of
找到:
Re: [docbook] Need help using MathML ("Unknown formatting object "{http:
其主要建议是:use namespace-aware stylesheets.
那待会自己去试的时候,也可以注意这点了。
5.写测试代码期间才发现,我之前自己的Docbook的源码中,就包含了MathML了:
<preface xml:id="preface"
xmlns="http://docbook.org/ns/docbook"
xmlns:xl="http://www.w3.org/1999/xlink"
xmlns:xi="http://www.w3.org/2001/XInclude"
xmlns:ns5="http://www.w3.org/1998/Math/MathML"
xmlns:ns4="http://www.w3.org/1999/xhtml"
xmlns:ns3="http://www.w3.org/2000/svg"
xmlns:ns="http://docbook.org/ns/docbook">
<title>前言</title>只是之前没用过罢了。
6.测试代码:
<?xml version='1.0' encoding="utf-8"?>
<!DOCTYPE book
[
<!ENTITY cur_book_name "test_mathml" >
<!ENTITY publish_date "2014-07-05" >
<!ENTITY release_version "0.1" >
<!ENTITY copyrith_year "2014" >
]>
<book version="5.0"
xmlns="http://docbook.org/ns/docbook"
xmlns:xi="http://www.w3.org/2001/XInclude"
xmlns:xl="http://www.w3.org/1999/xlink"
xmlns:mml="http://www.w3.org/1998/Math/MathML"
xml:lang="zh_CN">
<info>
<title>测试Mathml</title>
<subtitle></subtitle>
<keywordset>
<keyword>测试</keyword>
<keyword>MathML</keyword>
</keywordset>
<abstract>
<para>测试MathML是否能正常在转换后的pdf和html中显示</para>
</abstract>
<revhistory>
<revision>
<revnumber>&release_version;</revnumber>
<date>&publish_date;</date>
<revremark>
<orderedlist>
<listitem>第一版</listitem>
</orderedlist>
</revremark>
<authorinitials>crl</authorinitials>
</revision>
</revhistory>
</info>
<chapter xml:id="ch01_demo_mathml"
xmlns="http://docbook.org/ns/docbook"
xmlns:xl="http://www.w3.org/1999/xlink"
xmlns:xi="http://www.w3.org/2001/XInclude"
xmlns:mml="http://www.w3.org/1998/Math/MathML"
xmlns:ns="http://docbook.org/ns/docbook">
<title>demo MathML</title>
<para>
<inlineequation>
<mml:math display="inline">
<mml:mrow>
<mml:mrow>
<mml:mi>x</mml:mi>
<mml:mo>+</mml:mo>
<mml:mi>y</mml:mi>
</mml:mrow>
<mml:mo>=</mml:mo>
<mml:mn>2</mml:mn>
</mml:mrow>
</mml:math>
</inlineequation>
</para>
</chapter>
</book>结果编译出错:
=============================== generating test_mathml pdf ==============================
fop --execdebug -c E:/dev_root/docbook/dev/config/fop/conf/fop.xconf ../output/fo/test_mathml.fo -pdf ../output/pdf/test_mathml.pdf
exec "/cygdrive/c/Program Files/Java/jdk1.7.0_45/bin/java" -classpath "E:/dev_root/docbook/tools/fop-1.0/lib/xmlgraphics-commons-1.4.jar;E:/dev_root/docbook/tools/fop-1.0/lib/xml-apis-ext-1.3.04.jar;E:/dev_root/docbook/tools/fop-1.0/lib/xml-apis-1.3.04.jar;E:/dev_root/docbook/tools/fop-1.0/lib/xercesImpl-2.7.1.jar;E:/dev_root/docbook/tools/fop-1.0/lib/xalan-2.7.0.jar;E:/dev_root/docbook/tools/fop-1.0/lib/serializer-2.7.0.jar;E:/dev_root/docbook/tools/fop-1.0/lib/fop-hyph.jar;E:/dev_root/docbook/tools/fop-1.0/lib/commons-logging-1.0.4.jar;E:/dev_root/docbook/tools/fop-1.0/lib/commons-io-1.3.1.jar;E:/dev_root/docbook/tools/fop-1.0/lib/batik-all-1.7.jar;E:/dev_root/docbook/tools/fop-1.0/lib/avalon-framework-4.2.0.jar;E:/dev_root/docbook/tools/fop-1.0/build/fop.jar;E:/dev_root/docbook/tools/fop-1.0/build/fop-sandbox.jar;E:/dev_root/docbook/tools/fop-1.0/build/fop-hyph.jar" org.apache.fop.cli.Main "-c" "E:/dev_root/docbook/dev/config/fop/conf/fop.xconf" "../output/fo/test_mathml.fo" "-pdf" "../output/pdf/test_mathml.pdf"
七月 05, 2014 3:37:30 下午 org.apache.fop.apps.FopFactoryConfigurator configure
信息: Default page-height set to: 11in
七月 05, 2014 3:37:30 下午 org.apache.fop.apps.FopFactoryConfigurator configure
信息: Default page-width set to: 8.26in
七月 05, 2014 3:37:33 下午 org.apache.fop.events.LoggingEventListener processEvent
警告: Font "Cambria Math,normal,700" not found. Substituting with "Cambria Math,normal,400".
七月 05, 2014 3:37:33 下午 org.apache.fop.hyphenation.Hyphenator getHyphenationTree
严重: Couldn't find hyphenation pattern zh_cn
七月 05, 2014 3:37:34 下午 org.apache.fop.events.LoggingEventListener processEvent
警告: Unknown formatting object "{http://www.w3.org/1998/Math/MathML}math" encountered (a child of fo:instream-foreign-object}. (See position 1027:111)
七月 05, 2014 3:37:34 下午 org.apache.fop.events.LoggingEventListener processEvent
警告: Unknown formatting object "{http://www.w3.org/1998/Math/MathML}mrow" encountered (a child of math}. (See position 1028:25)
七月 05, 2014 3:37:34 下午 org.apache.fop.events.LoggingEventListener processEvent
警告: Unknown formatting object "{http://www.w3.org/1998/Math/MathML}mrow" encountered (a child of mrow}. (See position 1029:27)
七月 05, 2014 3:37:34 下午 org.apache.fop.events.LoggingEventListener processEvent
警告: Unknown formatting object "{http://www.w3.org/1998/Math/MathML}mi" encountered (a child of mrow}. (See position 1030:27)
七月 05, 2014 3:37:34 下午 org.apache.fop.events.LoggingEventListener processEvent
警告: Unknown formatting object "{http://www.w3.org/1998/Math/MathML}mo" encountered (a child of mrow}. (See position 1031:27)
七月 05, 2014 3:37:34 下午 org.apache.fop.events.LoggingEventListener processEvent
警告: Unknown formatting object "{http://www.w3.org/1998/Math/MathML}mi" encountered (a child of mrow}. (See position 1032:27)
七月 05, 2014 3:37:34 下午 org.apache.fop.events.LoggingEventListener processEvent
警告: Unknown formatting object "{http://www.w3.org/1998/Math/MathML}mo" encountered (a child of mrow}. (See position 1034:25)
七月 05, 2014 3:37:34 下午 org.apache.fop.events.LoggingEventListener processEvent
警告: Unknown formatting object "{http://www.w3.org/1998/Math/MathML}mn" encountered (a child of mrow}. (See position 1035:25)
七月 05, 2014 3:37:34 下午 org.apache.fop.events.LoggingEventListener processEvent
严重: The intrinsic dimensions of an instream-foreign-object could not be determined. (See position 1027:37)看起来,此处的fop中,暂时不支持MathML。
估计需要加入对应的库才可以?
7.把测试代码换成:
中的:
<equation>
<title>My MathML example</title>
<mml:math>
<mml:mrow>
<mml:mn>4</mml:mn>
<mml:mo>+</mml:mo>
<mml:mi>x</mml:mi>
</mml:mrow>
</mml:math>
</equation>即:
<chapter xml:id="ch01_demo_mathml"
xmlns="http://docbook.org/ns/docbook"
xmlns:xl="http://www.w3.org/1999/xlink"
xmlns:xi="http://www.w3.org/2001/XInclude"
xmlns:mml="http://www.w3.org/1998/Math/MathML"
xmlns:ns="http://docbook.org/ns/docbook">
<title>demo MathML</title>
<equation>
<title>My MathML example</title>
<mml:math>
<mml:mrow>
<mml:mn>4</mml:mn>
<mml:mo>+</mml:mo>
<mml:mi>x</mml:mi>
</mml:mrow>
</mml:math>
</equation>
</chapter>然后结果是:
还是同样错误。
8.google搜:
Unknown formatting object "{http://www.w3.org/1998/Math/MathML}math" encountered (a child of fo:instream-foreign-object}
找到:
然后去看看:
http://jeuclid.sourceforge.net/trunk/jeuclid-fop/
然后找到对应的下载的地方:
http://jeuclid.sourceforge.net/trunk/index.html
->
http://sourceforge.net/projects/jeuclid/files/3.1.x/
->
http://sourceforge.net/projects/jeuclid/files/3.1.x/3.1.9/
->
找了下fop的jar库:
jeuclid-fop-3.1.9-distribution.zip
然后解压拷贝对应的:
- jeuclid-core-3.1.9.jar
- jeuclid-fop-3.1.9.jar
到fop的lib中:
然后再去编译看看。
然后就真的没有错误了。
生成的pdf效果是:
很明显,没有看到我们想要的复杂的效果。
所以再去试试别的MathML的例子。
9.去把jeuclid中的example:
E:\dev_root\docbook\tools\MathML\jeuclid-fop-3.1.9-distribution\jeuclid-fop-3.1.9\example\example.mml
中的内容整合过来试试:
<chapter xml:id="ch01_demo_mathml"
xmlns="http://docbook.org/ns/docbook"
xmlns:xl="http://www.w3.org/1999/xlink"
xmlns:xi="http://www.w3.org/2001/XInclude"
xmlns:mml="http://www.w3.org/1998/Math/MathML"
xmlns:ns="http://docbook.org/ns/docbook">
<title>demo MathML</title>
<equation>
<title>My MathML example</title>
<mml:math>
<mml:mrow>
<mml:mn>4</mml:mn>
<mml:mo>+</mml:mo>
<mml:mi>x</mml:mi>
</mml:mrow>
</mml:math>
</equation>
<math xmlns="http://www.w3.org/1998/Math/MathML" mode="display">
<mrow>
<mo stretchy="false">{</mo>
<munder>
<mrow>
<mover>
<mrow>
<mpadded width="0"/>
<!--mpadded width="0">(</mpadded-->
<!-- \mathstrut -ugly hack a la TeX -->
<mi>a</mi>
<mo>,</mo>
<mo>...</mo>
<mo>,</mo>
<mi>a</mi>
</mrow>
<mover>
<mo>︷</mo>
<mrow>
<mi>k</mi>
<mtext> </mtext>
<mi>a</mi>
<mtext>'s</mtext>
</mrow>
</mover>
</mover>
<mo>,</mo>
<mover>
<mrow>
<mpadded/>
<!--mpadded width="0">(</mpadded-->
<!-- \mathstrut -ugly hack a la TeX -->
<mi>b</mi>
<mo>,</mo>
<mo>...</mo>
<mo>,</mo>
<mi>b</mi>
</mrow>
<mover>
<mo>︷</mo>
<mrow>
<mi>ℓ</mi>
<mtext> </mtext>
<mi>b</mi>
<mtext>'s</mtext>
</mrow>
</mover>
</mover>
</mrow>
<munder>
<mo>︸</mo>
<mrow>
<mi>k</mi>
<mo>+</mo>
<mi>ℓ</mi>
<mtext> elements</mtext>
</mrow>
</munder>
</munder>
<mo stretchy="false">}</mo>
</mrow>
</math>
</chapter>编译结果是出错:
org.apache.fop.apps.FOPException: org.apache.fop.fo.ValidationException: "{http://www.w3.org/1999/XSL/Format}instream-foreign-object" is not a valid child of "fo:flow"! (See position 1316:35)
javax.xml.transform.TransformerException: org.apache.fop.fo.ValidationException: "{http://www.w3.org/1999/XSL/Format}instream-foreign-object" is not a valid child of "fo:flow"! (See position 1316:35)
at org.apache.fop.cli.InputHandler.transformTo(InputHandler.java:302)
at org.apache.fop.cli.InputHandler.renderTo(InputHandler.java:130)
at org.apache.fop.cli.Main.startFOP(Main.java:174)
at org.apache.fop.cli.Main.main(Main.java:205)
Caused by: javax.xml.transform.TransformerException: org.apache.fop.fo.ValidationException: "{http://www.w3.org/1999/XSL/Format}instream-foreign-object" is not a valid child of "fo:flow"! (See position 1316:35)
at org.apache.xalan.transformer.TransformerIdentityImpl.transform(TransformerIdentityImpl.java:501)
at org.apache.fop.cli.InputHandler.transformTo(InputHandler.java:299)
... 3 more
Caused by: org.apache.fop.fo.ValidationException: "{http://www.w3.org/1999/XSL/Format}instream-foreign-object" is not a valid child of "fo:flow"! (See position 1316:35)
at org.apache.fop.events.ValidationExceptionFactory.createException(ValidationExceptionFactory.java:38)
at org.apache.fop.events.EventExceptionManager.throwException(EventExceptionManager.java:54)
at org.apache.fop.events.DefaultEventBroadcaster$1.invoke(DefaultEventBroadcaster.java:175)
at com.sun.proxy.$Proxy1.invalidChild(Unknown Source)
at org.apache.fop.fo.FONode.invalidChildError(FONode.java:534)
at org.apache.fop.fo.FONode.invalidChildError(FONode.java:517)
at org.apache.fop.fo.pagination.Flow.validateChildNode(Flow.java:103)
at org.apache.fop.fo.FOTreeBuilder$MainFOHandler.startElement(FOTreeBuilder.java:267)
at org.apache.fop.fo.FOTreeBuilder.startElement(FOTreeBuilder.java:171)
at org.apache.xalan.transformer.TransformerIdentityImpl.startElement(TransformerIdentityImpl.java:1072)
at org.apache.xerces.parsers.AbstractSAXParser.startElement(Unknown Source)
at org.apache.xerces.xinclude.XIncludeHandler.startElement(Unknown Source)
at org.apache.xerces.impl.XMLNSDocumentScannerImpl.scanStartElement(Unknown Source)
at org.apache.xerces.impl.XMLDocumentFragmentScannerImpl$FragmentContentDispatcher.dispatch(Unknown Source)
at org.apache.xerces.impl.XMLDocumentFragmentScannerImpl.scanDocument(Unknown Source)
at org.apache.xerces.parsers.XML11Configuration.parse(Unknown Source)
at org.apache.xerces.parsers.XML11Configuration.parse(Unknown Source)
at org.apache.xerces.parsers.XMLParser.parse(Unknown Source)
at org.apache.xerces.parsers.AbstractSAXParser.parse(Unknown Source)
at org.apache.xerces.jaxp.SAXParserImpl$JAXPSAXParser.parse(Unknown Source)
at org.apache.xalan.transformer.TransformerIdentityImpl.transform(TransformerIdentityImpl.java:484)
... 4 more
---------
javax.xml.transform.TransformerException: org.apache.fop.fo.ValidationException: "{http://www.w3.org/1999/XSL/Format}instream-foreign-object" is not a valid child of "fo:flow"! (See position 1316:35)
at org.apache.xalan.transformer.TransformerIdentityImpl.transform(TransformerIdentityImpl.java:501)
at org.apache.fop.cli.InputHandler.transformTo(InputHandler.java:299)
at org.apache.fop.cli.InputHandler.renderTo(InputHandler.java:130)
at org.apache.fop.cli.Main.startFOP(Main.java:174)
at org.apache.fop.cli.Main.main(Main.java:205)
Caused by: org.apache.fop.fo.ValidationException: "{http://www.w3.org/1999/XSL/Format}instream-foreign-object" is not a valid child of "fo:flow"! (See position 1316:35)
at org.apache.fop.events.ValidationExceptionFactory.createException(ValidationExceptionFactory.java:38)
at org.apache.fop.events.EventExceptionManager.throwException(EventExceptionManager.java:54)
at org.apache.fop.events.DefaultEventBroadcaster$1.invoke(DefaultEventBroadcaster.java:175)
at com.sun.proxy.$Proxy1.invalidChild(Unknown Source)
at org.apache.fop.fo.FONode.invalidChildError(FONode.java:534)
at org.apache.fop.fo.FONode.invalidChildError(FONode.java:517)
at org.apache.fop.fo.pagination.Flow.validateChildNode(Flow.java:103)
at org.apache.fop.fo.FOTreeBuilder$MainFOHandler.startElement(FOTreeBuilder.java:267)
at org.apache.fop.fo.FOTreeBuilder.startElement(FOTreeBuilder.java:171)
at org.apache.xalan.transformer.TransformerIdentityImpl.startElement(TransformerIdentityImpl.java:1072)
at org.apache.xerces.parsers.AbstractSAXParser.startElement(Unknown Source)
at org.apache.xerces.xinclude.XIncludeHandler.startElement(Unknown Source)
at org.apache.xerces.impl.XMLNSDocumentScannerImpl.scanStartElement(Unknown Source)
at org.apache.xerces.impl.XMLDocumentFragmentScannerImpl$FragmentContentDispatcher.dispatch(Unknown Source)
at org.apache.xerces.impl.XMLDocumentFragmentScannerImpl.scanDocument(Unknown Source)
at org.apache.xerces.parsers.XML11Configuration.parse(Unknown Source)
at org.apache.xerces.parsers.XML11Configuration.parse(Unknown Source)
at org.apache.xerces.parsers.XMLParser.parse(Unknown Source)
at org.apache.xerces.parsers.AbstractSAXParser.parse(Unknown Source)
at org.apache.xerces.jaxp.SAXParserImpl$JAXPSAXParser.parse(Unknown Source)
at org.apache.xalan.transformer.TransformerIdentityImpl.transform(TransformerIdentityImpl.java:484)
... 4 more
---------
org.apache.fop.fo.ValidationException: "{http://www.w3.org/1999/XSL/Format}instream-foreign-object" is not a valid child of "fo:flow"! (See position 1316:35)
at org.apache.fop.events.ValidationExceptionFactory.createException(ValidationExceptionFactory.java:38)
at org.apache.fop.events.EventExceptionManager.throwException(EventExceptionManager.java:54)
at org.apache.fop.events.DefaultEventBroadcaster$1.invoke(DefaultEventBroadcaster.java:175)
at com.sun.proxy.$Proxy1.invalidChild(Unknown Source)
at org.apache.fop.fo.FONode.invalidChildError(FONode.java:534)
at org.apache.fop.fo.FONode.invalidChildError(FONode.java:517)
at org.apache.fop.fo.pagination.Flow.validateChildNode(Flow.java:103)
at org.apache.fop.fo.FOTreeBuilder$MainFOHandler.startElement(FOTreeBuilder.java:267)
at org.apache.fop.fo.FOTreeBuilder.startElement(FOTreeBuilder.java:171)
at org.apache.xalan.transformer.TransformerIdentityImpl.startElement(TransformerIdentityImpl.java:1072)
at org.apache.xerces.parsers.AbstractSAXParser.startElement(Unknown Source)
at org.apache.xerces.xinclude.XIncludeHandler.startElement(Unknown Source)
at org.apache.xerces.impl.XMLNSDocumentScannerImpl.scanStartElement(Unknown Source)
at org.apache.xerces.impl.XMLDocumentFragmentScannerImpl$FragmentContentDispatcher.dispatch(Unknown Source)
at org.apache.xerces.impl.XMLDocumentFragmentScannerImpl.scanDocument(Unknown Source)
at org.apache.xerces.parsers.XML11Configuration.parse(Unknown Source)
at org.apache.xerces.parsers.XML11Configuration.parse(Unknown Source)
at org.apache.xerces.parsers.XMLParser.parse(Unknown Source)
at org.apache.xerces.parsers.AbstractSAXParser.parse(Unknown Source)
at org.apache.xerces.jaxp.SAXParserImpl$JAXPSAXParser.parse(Unknown Source)
at org.apache.xalan.transformer.TransformerIdentityImpl.transform(TransformerIdentityImpl.java:484)
at org.apache.fop.cli.InputHandler.transformTo(InputHandler.java:299)
at org.apache.fop.cli.InputHandler.renderTo(InputHandler.java:130)
at org.apache.fop.cli.Main.startFOP(Main.java:174)
at org.apache.fop.cli.Main.main(Main.java:205)
../../../../config/docbook.mk:560: recipe for target `../output/pdf/test_mathml.pdf' failed
make: *** [../output/pdf/test_mathml.pdf] Error 110.算了,换成带namespace的:
<chapter xml:id="ch01_demml:mo_mathml"
xmlns="http://docbook.org/ns/docbook"
xmlns:xl="http://www.w3.org/1999/xlink"
xmlns:xi="http://www.w3.org/2001/XInclude"
xmlns:mml="http://www.w3.org/1998/Math/MathML"
xmlns:ns="http://docbook.org/ns/docbook">
<title>demml:mo MathML</title>
<mml:mrow>
<mml:mo stretchy="false">{</mml:mo>
<mml:munder>
<mml:mrow>
<mml:mover>
<mml:mrow>
<mml:mpadded width="0"/>
<!--mml:mpadded width="0">(</mml:mpadded-->
<!-- \mathstrut -ugly hack a la TeX -->
<mml:mi>a</mml:mi>
<mml:mo>,</mml:mo>
<mml:mo>...</mml:mo>
<mml:mo>,</mml:mo>
<mml:mi>a</mml:mi>
</mml:mrow>
<mml:mover>
<mml:mo>︷</mml:mo>
<mml:mrow>
<mml:mi>k</mml:mi>
<mtext> </mtext>
<mml:mi>a</mml:mi>
<mtext>'s</mtext>
</mml:mrow>
</mml:mover>
</mml:mover>
<mml:mo>,</mml:mo>
<mml:mover>
<mml:mrow>
<mml:mpadded/>
<!--mml:mpadded width="0">(</mml:mpadded-->
<!-- \mathstrut -ugly hack a la TeX -->
<mml:mi>b</mml:mi>
<mml:mo>,</mml:mo>
<mml:mo>...</mml:mo>
<mml:mo>,</mml:mo>
<mml:mi>b</mml:mi>
</mml:mrow>
<mml:mover>
<mml:mo>︷</mml:mo>
<mml:mrow>
<mml:mi>ℓ</mml:mi>
<mtext> </mtext>
<mml:mi>b</mml:mi>
<mtext>'s</mtext>
</mml:mrow>
</mml:mover>
</mml:mover>
</mml:mrow>
<mml:munder>
<mml:mo>︸</mml:mo>
<mml:mrow>
<mml:mi>k</mml:mi>
<mml:mo>+</mml:mo>
<mml:mi>ℓ</mml:mi>
<mtext> elements</mtext>
</mml:mrow>
</mml:munder>
</mml:munder>
<mml:mo stretchy="false">}</mml:mo>
</mml:mrow>
</chapter>编译结果是:
还是出错。
11.算了,去找个简单的MathML的例子吧。。
<informalequation>
<mml:math>
<mml:msup>
<mml:mi>x</mml:mi>
<mml:mn>3</mml:mn>
</mml:msup>
</mml:math>
</informalequation>结果是:
可以正常生产pdf:
12.再去试试:
<inlineequation>
<mml:math display="inline">
<mml:mrow>
<mml:mrow>
<mml:mi>x</mml:mi>
<mml:mo>+</mml:mo>
<mml:mi>y</mml:mi>
</mml:mrow>
<mml:mo>=</mml:mo>
<mml:mn>2</mml:mn>
</mml:mrow>
</mml:math>
</inlineequation>结果是:
出错了:
org.apache.fop.apps.FOPException: org.apache.fop.fo.ValidationException: "{http://www.w3.org/1999/XSL/Format}instream-foreign-object" is not a valid child of "fo:flow"! (See position 1026:35)
javax.xml.transform.TransformerException: org.apache.fop.fo.ValidationException: "{http://www.w3.org/1999/XSL/Format}instream-foreign-object" is not a valid child of "fo:flow"! (See position 1026:35)
at org.apache.fop.cli.InputHandler.transformTo(InputHandler.java:302)
at org.apache.fop.cli.InputHandler.renderTo(InputHandler.java:130)
at org.apache.fop.cli.Main.startFOP(Main.java:174)
at org.apache.fop.cli.Main.main(Main.java:205)
Caused by: javax.xml.transform.TransformerException: org.apache.fop.fo.ValidationException: "{http://www.w3.org/1999/XSL/Format}instream-foreign-object" is not a valid child of "fo:flow"! (See position 1026:35)
at org.apache.xalan.transformer.TransformerIdentityImpl.transform(TransformerIdentityImpl.java:501)
at org.apache.fop.cli.InputHandler.transformTo(InputHandler.java:299)
... 3 more
Caused by: org.apache.fop.fo.ValidationException: "{http://www.w3.org/1999/XSL/Format}instream-foreign-object" is not a valid child of "fo:flow"! (See position 1026:35)
at org.apache.fop.events.ValidationExceptionFactory.createException(ValidationExceptionFactory.java:38)
at org.apache.fop.events.EventExceptionManager.throwException(EventExceptionManager.java:54)
at org.apache.fop.events.DefaultEventBroadcaster$1.invoke(DefaultEventBroadcaster.java:175)
at com.sun.proxy.$Proxy1.invalidChild(Unknown Source)
at org.apache.fop.fo.FONode.invalidChildError(FONode.java:534)
at org.apache.fop.fo.FONode.invalidChildError(FONode.java:517)
at org.apache.fop.fo.pagination.Flow.validateChildNode(Flow.java:103)
at org.apache.fop.fo.FOTreeBuilder$MainFOHandler.startElement(FOTreeBuilder.java:267)
at org.apache.fop.fo.FOTreeBuilder.startElement(FOTreeBuilder.java:171)
at org.apache.xalan.transformer.TransformerIdentityImpl.startElement(TransformerIdentityImpl.java:1072)
at org.apache.xerces.parsers.AbstractSAXParser.startElement(Unknown Source)
at org.apache.xerces.xinclude.XIncludeHandler.startElement(Unknown Source)
at org.apache.xerces.impl.XMLNSDocumentScannerImpl.scanStartElement(Unknown Source)
at org.apache.xerces.impl.XMLDocumentFragmentScannerImpl$FragmentContentDispatcher.dispatch(Unknown Source)
at org.apache.xerces.impl.XMLDocumentFragmentScannerImpl.scanDocument(Unknown Source)
at org.apache.xerces.parsers.XML11Configuration.parse(Unknown Source)
at org.apache.xerces.parsers.XML11Configuration.parse(Unknown Source)
at org.apache.xerces.parsers.XMLParser.parse(Unknown Source)
at org.apache.xerces.parsers.AbstractSAXParser.parse(Unknown Source)
at org.apache.xerces.jaxp.SAXParserImpl$JAXPSAXParser.parse(Unknown Source)
at org.apache.xalan.transformer.TransformerIdentityImpl.transform(TransformerIdentityImpl.java:484)
... 4 more
---------
javax.xml.transform.TransformerException: org.apache.fop.fo.ValidationException: "{http://www.w3.org/1999/XSL/Format}instream-foreign-object" is not a valid child of "fo:flow"! (See position 1026:35)
at org.apache.xalan.transformer.TransformerIdentityImpl.transform(TransformerIdentityImpl.java:501)
at org.apache.fop.cli.InputHandler.transformTo(InputHandler.java:299)
at org.apache.fop.cli.InputHandler.renderTo(InputHandler.java:130)
at org.apache.fop.cli.Main.startFOP(Main.java:174)
at org.apache.fop.cli.Main.main(Main.java:205)
Caused by: org.apache.fop.fo.ValidationException: "{http://www.w3.org/1999/XSL/Format}instream-foreign-object" is not a valid child of "fo:flow"! (See position 1026:35)
at org.apache.fop.events.ValidationExceptionFactory.createException(ValidationExceptionFactory.java:38)
at org.apache.fop.events.EventExceptionManager.throwException(EventExceptionManager.java:54)
at org.apache.fop.events.DefaultEventBroadcaster$1.invoke(DefaultEventBroadcaster.java:175)
at com.sun.proxy.$Proxy1.invalidChild(Unknown Source)
at org.apache.fop.fo.FONode.invalidChildError(FONode.java:534)
at org.apache.fop.fo.FONode.invalidChildError(FONode.java:517)
at org.apache.fop.fo.pagination.Flow.validateChildNode(Flow.java:103)
at org.apache.fop.fo.FOTreeBuilder$MainFOHandler.startElement(FOTreeBuilder.java:267)
at org.apache.fop.fo.FOTreeBuilder.startElement(FOTreeBuilder.java:171)
at org.apache.xalan.transformer.TransformerIdentityImpl.startElement(TransformerIdentityImpl.java:1072)
at org.apache.xerces.parsers.AbstractSAXParser.startElement(Unknown Source)
at org.apache.xerces.xinclude.XIncludeHandler.startElement(Unknown Source)
at org.apache.xerces.impl.XMLNSDocumentScannerImpl.scanStartElement(Unknown Source)
at org.apache.xerces.impl.XMLDocumentFragmentScannerImpl$FragmentContentDispatcher.dispatch(Unknown Source)
at org.apache.xerces.impl.XMLDocumentFragmentScannerImpl.scanDocument(Unknown Source)
at org.apache.xerces.parsers.XML11Configuration.parse(Unknown Source)
at org.apache.xerces.parsers.XML11Configuration.parse(Unknown Source)
at org.apache.xerces.parsers.XMLParser.parse(Unknown Source)
at org.apache.xerces.parsers.AbstractSAXParser.parse(Unknown Source)
at org.apache.xerces.jaxp.SAXParserImpl$JAXPSAXParser.parse(Unknown Source)
at org.apache.xalan.transformer.TransformerIdentityImpl.transform(TransformerIdentityImpl.java:484)
... 4 more
---------
org.apache.fop.fo.ValidationException: "{http://www.w3.org/1999/XSL/Format}instream-foreign-object" is not a valid child of "fo:flow"! (See position 1026:35)
at org.apache.fop.events.ValidationExceptionFactory.createException(ValidationExceptionFactory.java:38)
at org.apache.fop.events.EventExceptionManager.throwException(EventExceptionManager.java:54)
at org.apache.fop.events.DefaultEventBroadcaster$1.invoke(DefaultEventBroadcaster.java:175)
at com.sun.proxy.$Proxy1.invalidChild(Unknown Source)
at org.apache.fop.fo.FONode.invalidChildError(FONode.java:534)
at org.apache.fop.fo.FONode.invalidChildError(FONode.java:517)
at org.apache.fop.fo.pagination.Flow.validateChildNode(Flow.java:103)
at org.apache.fop.fo.FOTreeBuilder$MainFOHandler.startElement(FOTreeBuilder.java:267)
at org.apache.fop.fo.FOTreeBuilder.startElement(FOTreeBuilder.java:171)
at org.apache.xalan.transformer.TransformerIdentityImpl.startElement(TransformerIdentityImpl.java:1072)
at org.apache.xerces.parsers.AbstractSAXParser.startElement(Unknown Source)
at org.apache.xerces.xinclude.XIncludeHandler.startElement(Unknown Source)
at org.apache.xerces.impl.XMLNSDocumentScannerImpl.scanStartElement(Unknown Source)
at org.apache.xerces.impl.XMLDocumentFragmentScannerImpl$FragmentContentDispatcher.dispatch(Unknown Source)
at org.apache.xerces.impl.XMLDocumentFragmentScannerImpl.scanDocument(Unknown Source)
at org.apache.xerces.parsers.XML11Configuration.parse(Unknown Source)
at org.apache.xerces.parsers.XML11Configuration.parse(Unknown Source)
at org.apache.xerces.parsers.XMLParser.parse(Unknown Source)
at org.apache.xerces.parsers.AbstractSAXParser.parse(Unknown Source)
at org.apache.xerces.jaxp.SAXParserImpl$JAXPSAXParser.parse(Unknown Source)
at org.apache.xalan.transformer.TransformerIdentityImpl.transform(TransformerIdentityImpl.java:484)
at org.apache.fop.cli.InputHandler.transformTo(InputHandler.java:299)
at org.apache.fop.cli.InputHandler.renderTo(InputHandler.java:130)
at org.apache.fop.cli.Main.startFOP(Main.java:174)
at org.apache.fop.cli.Main.main(Main.java:205)所以去尝试解决此MathML的语言错误。
13.去查查MathML的语法。
找到了官网:
->
Mathematical Markup Language (MathML) Version 3.0
->
里面有N多例子和详细语法的解释。
14.最后,终于搞清楚上述的错误原因了:
误把informalequation弄成了inlineequation
->是的编译时出错,说是,对于(inlineequation的)instream-foreign-object其下不支持fo:flow
->而对于本身informalequation,是正常支持的
最后,用:
<chapter xml:id="ch01_demml:mo_mathml"
xmlns="http://docbook.org/ns/docbook"
xmlns:xl="http://www.w3.org/1999/xlink"
xmlns:xi="http://www.w3.org/2001/XInclude"
xmlns:mml="http://www.w3.org/1998/Math/MathML"
xmlns:ns="http://docbook.org/ns/docbook">
<title>demo MathML</title>
<informalequation>
<mml:math display="inline">
<mml:mrow>
<mml:mrow>
<mml:mi>x</mml:mi>
<mml:mo>+</mml:mo>
<mml:mi>y</mml:mi>
</mml:mrow>
<mml:mo>=</mml:mo>
<mml:mn>2</mml:mn>
</mml:mrow>
</mml:math>
</informalequation>
</chapter>就可以正常的生成pdf了:
15.另外,再去参考官网的很多例子:
去试试各种效果:
(1)代码:
<informalequation>
<mml:math>
<mml:mrow>
<mml:mo> ( </mml:mo>
<mml:mfrac linethickness="0">
<mml:mi> a </mml:mi>
<mml:mi> b </mml:mi>
</mml:mfrac>
<mml:mo> ) </mml:mo>
</mml:mrow>
<mml:mfrac linethickness="2">
<mml:mfrac>
<mml:mi> a </mml:mi>
<mml:mi> b </mml:mi>
</mml:mfrac>
<mml:mfrac>
<mml:mi> c </mml:mi>
<mml:mi> d </mml:mi>
</mml:mfrac>
</mml:mfrac>
</mml:math>
</informalequation>效果:
评价:不太好,和原先官网的效果有很大差距。。。
(2)代码:
<informalequation>
<mml:math>
<mml:mfrac>
<mml:mn> 1 </mml:mn>
<mml:mrow>
<mml:msup>
<mml:mi> x </mml:mi>
<mml:mn> 3 </mml:mn>
</mml:msup>
<mml:mo> + </mml:mo>
<mml:mfrac>
<mml:mi> x </mml:mi>
<mml:mn> 3 </mml:mn>
</mml:mfrac>
</mml:mrow>
</mml:mfrac>
<mml:mo> = </mml:mo>
<mml:mfrac bevelled="true">
<mml:mn> 1 </mml:mn>
<mml:mrow>
<mml:msup>
<mml:mi> x </mml:mi>
<mml:mn> 3 </mml:mn>
</mml:msup>
<mml:mo> + </mml:mo>
<mml:mfrac>
<mml:mi> x </mml:mi>
<mml:mn> 3 </mml:mn>
</mml:mfrac>
</mml:mrow>
</mml:mfrac>
</mml:math>
</informalequation>效果:
评价:效果真心不错。
16.另外再参考:
最后来个大集合:
<?xml version='1.0' encoding="utf-8"?>
<!DOCTYPE book
[
<!ENTITY cur_book_name "test_mathml" >
<!ENTITY publish_date "2014-07-05" >
<!ENTITY release_version "0.1" >
<!ENTITY copyrith_year "2014" >
]>
<book version="5.0"
xmlns="http://docbook.org/ns/docbook"
xmlns:xi="http://www.w3.org/2001/XInclude"
xmlns:xl="http://www.w3.org/1999/xlink"
xmlns:mml="http://www.w3.org/1998/Math/MathML"
xml:lang="zh_CN">
<info>
<title>测试Mathml</title>
<subtitle></subtitle>
<keywordset>
<keyword>测试</keyword>
<keyword>MathML</keyword>
</keywordset>
<abstract>
<para>测试MathML是否能正常在转换后的pdf和html中显示</para>
</abstract>
<revhistory>
<revision>
<revnumber>&release_version;</revnumber>
<date>&publish_date;</date>
<revremark>
<orderedlist>
<listitem>第一版</listitem>
</orderedlist>
</revremark>
<authorinitials>crl</authorinitials>
</revision>
</revhistory>
</info>
<chapter xml:id="ch01_demml:mo_mathml"
xmlns="http://docbook.org/ns/docbook"
xmlns:xl="http://www.w3.org/1999/xlink"
xmlns:xi="http://www.w3.org/2001/XInclude"
xmlns:mml="http://www.w3.org/1998/Math/MathML"
xmlns:ns="http://docbook.org/ns/docbook">
<title>demo MathML</title>
<sect1 xml:id="mathml_demo_mrow"><title>MathML演示:mrow的效果</title>
<para>代码:</para>
<programlisting language="xml">
<![CDATA[
<informalequation>
<mml:math display="inline">
<mml:mrow>
<mml:mrow>
<mml:mi>x</mml:mi>
<mml:mo>+</mml:mo>
<mml:mi>y</mml:mi>
</mml:mrow>
<mml:mo>=</mml:mo>
<mml:mn>2</mml:mn>
</mml:mrow>
</mml:math>
</informalequation>
]]>
</programlisting>
<para>效果:</para>
<informalequation>
<mml:math display="inline">
<mml:mrow>
<mml:mrow>
<mml:mi>x</mml:mi>
<mml:mo>+</mml:mo>
<mml:mi>y</mml:mi>
</mml:mrow>
<mml:mo>=</mml:mo>
<mml:mn>2</mml:mn>
</mml:mrow>
</mml:math>
</informalequation>
</sect1>
<sect1 xml:id="mathml_demo_msup"><title>MathML演示:msup的效果</title>
<para>代码:</para>
<programlisting language="xml">
<![CDATA[
<informalequation>
<mml:math>
<mml:msup>
<mml:mi>x</mml:mi>
<mml:mn>3</mml:mn>
</mml:msup>
</mml:math>
</informalequation>
<informalequation>
<mml:math>
<mml:msup>
<mml:msqrt>
<mml:mrow>
<mml:mi>a</mml:mi>
<mml:mo>+</mml:mo>
<mml:mi>b</mml:mi>
</mml:mrow>
</mml:msqrt>
<mn>27</mn>
</mml:msup>
</mml:math>
</informalequation>
]]>
</programlisting>
<para>效果:</para>
<informalequation>
<mml:math>
<mml:msup>
<mml:mi>x</mml:mi>
<mml:mn>3</mml:mn>
</mml:msup>
</mml:math>
</informalequation>
<informalequation>
<mml:math>
<mml:msup>
<mml:msqrt>
<mml:mrow>
<mml:mi>a</mml:mi>
<mml:mo>+</mml:mo>
<mml:mi>b</mml:mi>
</mml:mrow>
</mml:msqrt>
<mn>27</mn>
</mml:msup>
</mml:math>
</informalequation>
</sect1>
<sect1 xml:id="mathml_demo_mfrac_1"><title>MathML演示:mfrac的效果1</title>
<para>代码:</para>
<programlisting language="xml">
<![CDATA[
<informalequation>
<mml:math>
<mml:mrow>
<mml:mo> ( </mml:mo>
<mml:mfrac linethickness="0">
<mml:mi> a </mml:mi>
<mml:mi> b </mml:mi>
</mml:mfrac>
<mml:mo> ) </mml:mo>
</mml:mrow>
<mml:mfrac linethickness="2">
<mml:mfrac>
<mml:mi> a </mml:mi>
<mml:mi> b </mml:mi>
</mml:mfrac>
<mml:mfrac>
<mml:mi> c </mml:mi>
<mml:mi> d </mml:mi>
</mml:mfrac>
</mml:mfrac>
</mml:math>
</informalequation>
]]>
</programlisting>
<para>效果:</para>
<informalequation>
<mml:math>
<mml:mrow>
<mml:mo> ( </mml:mo>
<mml:mfrac linethickness="0">
<mml:mi> a </mml:mi>
<mml:mi> b </mml:mi>
</mml:mfrac>
<mml:mo> ) </mml:mo>
</mml:mrow>
<mml:mfrac linethickness="2">
<mml:mfrac>
<mml:mi> a </mml:mi>
<mml:mi> b </mml:mi>
</mml:mfrac>
<mml:mfrac>
<mml:mi> c </mml:mi>
<mml:mi> d </mml:mi>
</mml:mfrac>
</mml:mfrac>
</mml:math>
</informalequation>
</sect1>
<sect1 xml:id="mathml_demo_mfrac_2"><title>MathML演示:mfrac的效果2</title>
<para>代码:</para>
<programlisting language="xml">
<![CDATA[
<informalequation>
<mml:math>
<mml:mfrac>
<mml:mn> 1 </mml:mn>
<mml:mrow>
<mml:msup>
<mml:mi> x </mml:mi>
<mml:mn> 3 </mml:mn>
</mml:msup>
<mml:mo> + </mml:mo>
<mml:mfrac>
<mml:mi> x </mml:mi>
<mml:mn> 3 </mml:mn>
</mml:mfrac>
</mml:mrow>
</mml:mfrac>
<mml:mo> = </mml:mo>
<mml:mfrac bevelled="true">
<mml:mn> 1 </mml:mn>
<mml:mrow>
<mml:msup>
<mml:mi> x </mml:mi>
<mml:mn> 3 </mml:mn>
</mml:msup>
<mml:mo> + </mml:mo>
<mml:mfrac>
<mml:mi> x </mml:mi>
<mml:mn> 3 </mml:mn>
</mml:mfrac>
</mml:mrow>
</mml:mfrac>
</mml:math>
</informalequation>
]]>
</programlisting>
<para>效果:</para>
<informalequation>
<mml:math>
<mml:mfrac>
<mml:mn> 1 </mml:mn>
<mml:mrow>
<mml:msup>
<mml:mi> x </mml:mi>
<mml:mn> 3 </mml:mn>
</mml:msup>
<mml:mo> + </mml:mo>
<mml:mfrac>
<mml:mi> x </mml:mi>
<mml:mn> 3 </mml:mn>
</mml:mfrac>
</mml:mrow>
</mml:mfrac>
<mml:mo> = </mml:mo>
<mml:mfrac bevelled="true">
<mml:mn> 1 </mml:mn>
<mml:mrow>
<mml:msup>
<mml:mi> x </mml:mi>
<mml:mn> 3 </mml:mn>
</mml:msup>
<mml:mo> + </mml:mo>
<mml:mfrac>
<mml:mi> x </mml:mi>
<mml:mn> 3 </mml:mn>
</mml:mfrac>
</mml:mrow>
</mml:mfrac>
</mml:math>
</informalequation>
</sect1>
<sect1 xml:id="mathml_demo_mfenced"><title>MathML演示:mfenced的效果</title>
<para>代码:</para>
<programlisting language="xml">
<![CDATA[
<informalequation>
<mml:math>
<mml:mrow>
<mml:msup>
<mml:mfenced open="[" close="]">
<mml:mrow>
<mml:mi>a</mml:mi>
<mml:mo>+</mml:mo>
<mml:mi>b</mml:mi>
</mml:mrow>
</mml:mfenced>
<mn>260</mn>
</mml:msup>
<mml:mo>+</mml:mo>
<mml:msub>
<mml:mfenced open="{" close="}">
<mml:mrow>
<mml:mi>a</mml:mi>
<mml:mo>+</mml:mo>
<mml:mi>b</mml:mi>
</mml:mrow>
</mml:mfenced>
<mml:mi>i</mml:mi>
</mml:msub>
</mml:mrow>
</mml:math>
</informalequation>
]]>
</programlisting>
<para>效果:</para>
<informalequation>
<mml:math>
<mml:mrow>
<mml:msup>
<mml:mfenced open="[" close="]">
<mml:mrow>
<mml:mi>a</mml:mi>
<mml:mo>+</mml:mo>
<mml:mi>b</mml:mi>
</mml:mrow>
</mml:mfenced>
<mn>260</mn>
</mml:msup>
<mml:mo>+</mml:mo>
<mml:msub>
<mml:mfenced open="{" close="}">
<mml:mrow>
<mml:mi>a</mml:mi>
<mml:mo>+</mml:mo>
<mml:mi>b</mml:mi>
</mml:mrow>
</mml:mfenced>
<mml:mi>i</mml:mi>
</mml:msub>
</mml:mrow>
</mml:math>
</informalequation>
</sect1>
</chapter>
</book>效果:
评价:
其中部分的内容,显示异常,比如开根号之后的27次方等内容。
【总结】
此处在fop中用jeuclid去支持MathML的效果是:
1.一般的内容,都是可以正常输出pdf效果的。
2.有些复杂的,输出效果,要么是格式不对,要么是缺少内容。
总体评价:凑合用吧。
转载请注明:在路上 » 【记录】尝试给Docbook添加MathML的支持