【背景】
收到别人一个邮件,说是在使用Docbook转PDF时,
对于:
1 2 3 4 5 6 7 8 9 10 11 12 13 | < 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了:
1 2 3 4 5 6 7 8 9 | < preface xml:id = "preface" < title >前言</ title > |
只是之前没用过罢了。
6.测试代码:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 | <? 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" 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" < 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 > |
结果编译出错:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 | =============================== 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.把测试代码换成:
中的:
1 2 3 4 5 6 7 8 9 10 | < 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 > |
即:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 | < chapter xml:id = "ch01_demo_mathml" < 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
中的内容整合过来试试:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 | < chapter xml:id = "ch01_demo_mathml" < 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 > < 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 > |
编译结果是出错:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 | 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 1 |
10.算了,换成带namespace的:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 | < chapter xml:id = "ch01_demml:mo_mathml" < 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的例子吧。。
1 2 3 4 5 6 7 8 | < informalequation > < mml:math > < mml:msup > < mml:mi >x</ mml:mi > < mml:mn >3</ mml:mn > </ mml:msup > </ mml:math > </ informalequation > |
结果是:
可以正常生产pdf:
12.再去试试:
1 2 3 4 5 6 7 8 9 10 11 12 13 | < 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 > |
结果是:
出错了:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 | 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,是正常支持的
最后,用:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 | < chapter xml:id = "ch01_demml:mo_mathml" < 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)代码:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 | < 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)代码:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 | < 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.另外再参考:
最后来个大集合:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101 102 103 104 105 106 107 108 109 110 111 112 113 114 115 116 117 118 119 120 121 122 123 124 125 126 127 128 129 130 131 132 133 134 135 136 137 138 139 140 141 142 143 144 145 146 147 148 149 150 151 152 153 154 155 156 157 158 159 160 161 162 163 164 165 166 167 168 169 170 171 172 173 174 175 176 177 178 179 180 181 182 183 184 185 186 187 188 189 190 191 192 193 194 195 196 197 198 199 200 201 202 203 204 205 206 207 208 209 210 211 212 213 214 215 216 217 218 219 220 221 222 223 224 225 226 227 228 229 230 231 232 233 234 235 236 237 238 239 240 241 242 243 244 245 246 247 248 249 250 251 252 253 254 255 256 257 258 259 260 261 262 263 264 265 266 267 268 269 270 271 272 273 274 275 276 277 278 279 280 281 282 283 284 285 286 287 288 289 290 291 292 293 294 295 296 297 298 299 300 301 302 303 304 305 306 307 308 309 310 311 312 313 314 315 316 317 318 319 320 321 322 323 324 325 326 327 328 329 330 331 332 333 334 335 336 337 338 339 | <? 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" 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" < 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的支持