。
生成发布文档
上面我们使用DocBook创建了SampleBook文档及其相关文档,这些文档仅仅是根据DocBook 5的规范通过XML记载了内容,现在,我们需要将其转换为HTML文档及PDF文档。将使用DocBook书写的内容转换成其他形式的文档,既是我们的目的,也是最精彩、最激动人心、最令人热血澎湃的过程。
生成HTML文档
使用DocBook样式表生成HTML文档
我们使用Mac OS X的默认脚本语言Bash来自动生成HTML文档。
打开一个终端,运行以下脚本:
cd /Users/sarkuya/Documents/My\ DocBook\ Books/My\ First\ Book touch GenHTML.sh chmod u+x GenHTML.sh
记得将上面的路径换成您的路径。第一行使用“cd”命令将当前路径切换至“My First Book”下面。由于上面的路径名称出现了空格,因此使用“\ ”来转义空格(也可以将整个路径名用半角的""括起来,这样无需转义)。第二行的“touch”命令新建一个空白的“GenHTML.sh”文件,第三行的“chmod”命令将该脚本文件的运行权限赋予当前用户。
在Mac OS X的Finder中将GenHTML.sh文件拖至NetBeans的编辑器窗口中,这样,NetBeans将自动打开并可编辑该文件。输入以下的内容。
#!/bin/bash export XML_CATALOG_FILES="file:///usr/share/xml/docbook/catalog.xml" xsltproc --xinclude --output Product/SampleBook.html docbook.xsl Content/SampleBook.xml
因为UNIX系统中允许存在并同时运行多个shell脚本,上面代码的第一行指定了使用Bourne-Again shell。
默认情况下,xsltproc会自动根据环境变量“XML_CATALOG_FILES”的内容在“/etc/xml/catalog”路径下查找catalog.xml文件,因此,如果我们将上面的catalog.xml文件放在“/etc/xml/catalog”的路径下,第二行可以省略。正如上面代码所示,我们可以通过export命令设置环境变量“XML_CATALOG_FILES”从而达到改变默认状态的效果。
代码第三行中,源文件为Content路径下面的SampleBook.xml,套用docbook.xsl所指定的格式后,将在Product路径下面生成SampleBook.html文档。
需注意的是,上面的docbook.xsl是从何而来?我们并未创建此文件。回顾上面创建catalog.xml文件一节的内容,该文件中有一行内容如下:
......
uri标签将“docbook.xsl”的标识符与“/usr/share/xml/docbook/docbook-xsl-1.76.1/html/docbook.xsl”相映射。这样,当xsltproc遇到“docbook.xsl”的标识符时,便会自动调用后者。这样做的好处是,当以后我们安装了docbook-xsl新的版本,只需修改catalog.xml文件的该行即可。这是使用Catalog来部署的一大好处。
由于在上一节中,我们使用了XInclude,因此,xsltproc需要添加“--xinclude”的参数。并且,在xsltproc中,我们只需指定主干文档SampleBook.xml,而无需指定chapter1.xml或chapter2.xml。
在终端中,在GenHTML.sh文件所在路径下,运行下面的命令:
./GenHTML.sh
在Product路径下面,双击SampleBook.html,您就会看到所生成的SampleBook.html的效果图。
可以看出,相对于我们所编写的内容比较简单的SampleBook.xml,这个自动生成的网页为我们提供了一些额外的排版功效:
文章标题下有一条点缀横线。
dedication部分加上了题词的标题,chapter部分自动加上了第几章的序号。
分别为全书及各章加上了目录及相应的链接。
分别为标题、内容设置了对应大小的字体。
Oh My God! 这些信手拈来的界面效果,如果让我来排版,真不知从何下手!(边框除外,这是通过用于Safari的wiget - Web Clip实现的)
故事固然精彩,但还远未到结束的时候。我们还可以通过自己的CSS来让这个网页锦上添花。
广告诗词之后,故事更加精彩。:◃)
“使用DocBook, 杜撰内容高深枯涩的文字,你......来! [左手指向对方,边抖,来字顿收。毕恭毕敬] 排版的苦力活,我......来! [拍几下胸脯,延隔了少许秒。义无反顾] 两人联手,天--下--无--贼! [左手作握手姿态,平伸而出,肘微曲;右手五指张开,做朝天而抓状;头仰天。豪气冲天]”
猜猜看,猜猜看,我上面的大鼻子笑脸使用了哪个字符实体?
好,让我们回到演播现场,继续演绎我们精彩的故事。
使用自定义样式表生成HTML
首先,在"My First Book"目录下面新建一个“XSL”目录,并在里面新建一个名为“html.xsl”的文件。内容如下:
之前我们使用docbook-xsl来生成HTML文档,没有太多自主权。要调用自定义的CSS,我们需要一个入口。这个入口就是用以取代docbook-xsl的html.xsl。首先,它导入了原来的docbook-xsl作为基础,然后指定了调用css路径下面的style.css文件来继续排版。转换的目标是HTML文件,编码为UTF-8,格式缩进。接着,设置制作目录的级数为2级,章下面的节采用自动编号的形式,且该编号自动包括上级编号。
现在,可以准备CSS文件了。在"My First Book"目录下面新建一个“CSS”目录,并在里面新建一个名为“style.css”的文件。内容如下:
html { background: -webkit-gradient(linear, left top, left bottom, from(#00abeb), to(#fff)); } body { background-color: #333; margin: 1em; padding: 1em; -webkit-border-radius: 6px; -webkit-box-shadow: 0 0 14px #123; } h1.title { color: #cb6c8a; } h2.title { color: #cb6c8a; } div.section h2.title { color: #82a4bb; } p { color: #bfbbaf; text-indent: 2em; } a:link { color: #7a8a39; } a:hover { color: palegreen; } body div.titlepage h1.title { text-align: center; } div.chapter { margin-top: 5em; } div.chapter h2.title { border-bottom: 1px solid grey; } div.section h2.title { border-bottom-width: 0; } div.toc p { text-indent: 0; color: #ccc; } div.toc { border: 1px dashed gray; padding: 0.5em; margin-left: 2em; } div.toc dl dd dl { margin-top: 0px; }
下面看到实际网页效果后,再来解释CSS。
接下来,我们修改GenHTML.sh文件的内容。
#!/bin/bash export XML_CATALOG_FILES="file:///usr/share/xml/docbook/catalog.xml" rm -r Product mkdir -p Product/{css,images} cp CSS/style.css Product/css xsltproc --xinclude --output Product/SampleBook.html XSL/html.xsl Content/SampleBook.xml
我们的网页不再孤独,它还需要CSS文件,以后可能还需要图片美化。CSS文件及图像文件都需要随同SampleBook.html文件一起发布。因此,我们需要规划Product的内容了。由于Product用于存放自动生成的文档,为避免与上一次的生成结果混在一起,rm命令先将此目录及所有子目录全部删除。之后,在其下面创建了css及images这两个并行的目录。然后,将CSS路径下的style.css复制到Product目录下的css目录下。
xsltproc这次不再调用docbook-xsl,而是调用我们上面所创建的存放于XSL路径下面的html.xsl文件。通过xsltproc,我们把上面所生成的所有文件都组成了一条生产线。
再次运行GenHTML.sh,您将看到以下的效果。
有点像使用iPad 2的感觉吧?呵呵。
在style.css中,我用到了Safari所支持的webkit引擎的圆角及背景色渐变的功能。调色方案使用的是ColorBurn的Troubadour High Score方案。应指出,在编辑CSS过程中需选择各个元素时,我借助于Safari的“检查元素”功能,多快好省地达到了目标。Safari已经成为我目前钟意的浏览器了。
除了界面上与上次不同之外,一个重要的不同之处是章下面的节出现了自动数字序号。这是使用DocBook的一大重要原因:你来写,我来实时编号。
生成由多个网页组成的HTML
目前为止,我们的书确实很短。但如果我们的书很长呢?将一本1000页的书的内容全部放在一个网页中,会不会让读者感到很累?如果能将整本书像连续剧一样分集,只要链接与索引做得好,读者肯定很欢迎。
DocBook支持这种将整本书分成多个单独的网页,并自动在网页间做好相应的链接。我们的书虽短,但有多个章节,可以实现此目标。
在往下走之前,我们先思考2个问题。
是否需要同时生成单页面的HTML文件及多页面的HTML文件?
如果需要同时生成,单页面的HTML文件及多页面的HTML文件应否共享CSS及图像?
我的建议是,最好同时生成。且为了发布时方便,不应共享CSS及图像。这样可满足各种不同需求的场合。
我们需要保留原来生成单网页的HTML的指令,但对Product的路径应做适当调整如下。
pdf路径为将来生成的PDF文件预留。html分为chunk及single两个路径,分别存放多网页及单网页的HTML文档。这两个路径下面均带有自己的css及images子目录。
现在可以修改GenHTML.sh了。
#!/bin/bash export XML_CATALOG_FILES="file:///usr/share/xml/docbook/catalog.xml" rm -r Product mkdir -p Product/{html/{chunk/{css,images},single/{css,images}},pdf} cp -r CSS/ Product/html/chunk/css cp -r CSS/ Product/html/single/css xsltproc --xinclude --output Product/html/single/SampleBook.html XSL/html.xsl Content/SampleBook.xml
这次的cp命令将CSS路径下面的内容,包括子路径及所有的文件全部复制。注意CSS之后的“/”。在基于GNU的UNIX系统中,不管路径后面是否有“/”,都一样地将该路径及其下面所有路径及文件都复制。而在基于BSD的UNIX系统中,没有“/”,连同该路径一起复制,若有“/”,则只复制其下面的路径和文件,但不包括该路径。Mac OS X是基于FreeBSD及NetBSD的UNIX系统,因此,在cp命令中源路径名后面是否带有“/”含义不一样。由于源路径名是大写的“CSS”,而目标路径名是小写的“css”,显然我们不需要复制源路径本身。因此需要在源路径“CSS”后面加上“/”。
生成多网页的HTML文档的方法并不复杂。将XSL路径下面的html.xsl复制为chunk.xsl,并修改chunk.xsl的内容如下:
在GenHTML.sh文件中添加生成多网页的HTML的内容。
...... xsltproc --xinclude --output Product/html/single/SampleBook.html XSL/html.xsl Content/SampleBook.xml xsltproc --xinclude --output Product/html/chunk/SampleBook.html XSL/chunk.xsl Content/SampleBook.xml
运行GenHTML.sh,在相应路径下检查是否已经同时生成单网页及多网页的HTML,并看看多网页的HTML的效果。
由于原来的CSS的采用了黑色作为背景色,新生成的多网页HTML部分字体偏暗,因此需对style.css做适当修改。
...... a:link, a:visited { color: #7a8a39; } ...... div.navheader table th, div.navfooter table td { color: #bfbbaf; }
再次运行GenHTML.sh,可依序看到下面的页面效果(iPad之后,再送您5个iPhone)。
“Oh My God!”
“Shut up! Not any more!”
“OK... ... 我的主啊,此乃神作,非人可为也!”
如果查看所生成网页的源代码,就会发现,即使是神作,也是有问题的。一是charset为ISO-8859-1,而不是UTF-8;二是源代码没有自动断行。原来html.xsl中相应的配置对多网页HTML不起作用。修改chunk.xsl的内容如下:
注意 : xsl:param中的select,如果值不是数值型,而是字符串型,需在“”中另加''来括起来。
再查看网页的源代码,问题已经解决。
加入图标
上面生成的HTML由于没有图标,因此还不够生动。docbook-xsl已经内置了几项图标服务:
警示图标,如使用note, tip, warning, caution, important等标签时
导航图标,如上一页,下一页使用的图标
注解说明中出现的数字图标
现在我们开始看看docbook-xsl对警示图标的支持。编辑chapter1.xml,加入以下内容:
...... ...... HTML的重要性 如何评估HTML的重要性都不为过。 当然是往高评估。
为看清新加的内容,修改style.css:
...... div.note { color: #999; border: 1px solid gray; }
观察自动生成的ch01s02.html及其源代码,多了“注意”两个字,但没有图标出现。
修改chunk.xsl:
......
上面语句将警示的图标功能打开。重新运行GenHTML.sh,再观察ch01s02.html。
两个发现。一个是有了图标的占位符,但没有图标出现。二是尽管我们上面已经修改了style.css中div.note的元素,但字体颜色还是变黑了。如果您使用的浏览器是Safari,用鼠标刷黑“注意”两字,按右键,选“检查元素”,您会发现div.note下面插入了一个table,图标及文字均放在此表中了。
修改style.css:
...... div.note table { color: #999; border: 1px solid gray; width: 100%; }
放在表格中的内容加上外框后如果太短不美观,因此将其长度调为100%。
再观察生成的源代码中img标签:
生成的网页期待有一个note.png的图像文件放在images路径下面。到哪找note.png?docbook-xsl已经为我们提供了包括note.png在内的日常所需图标,就放在docbook-xsl-1.76.1/images路径下面。
我们不应仅仅使用docbook-xsl的图标,还应有自己的图片。因此,先在“My First Book”路径下新建一个“IMAGES”目录,用于存放自己创建的图片。这些图片连同docbook-xsl的图标一起,在发布时均要复制到Product的相应路径下面。现在,我们需要重新规划Product下面的路径了。
主要是在各个images路径下面均分为custom及docbook两种,分别存放我们自己创建的和docbook自带的图片。这样的部署,不相混杂,维护方便。另外也为pdf目录做了提前准备。
修改GenHTML.sh:
#!/bin/bash export DOCBOOK_DIR="/usr/share/xml/docbook" export XML_CATALOG_FILES="$DOCBOOK_DIR/catalog.xml" export DOCBOOK_XSL_DIR="$DOCBOOK_DIR/docbook-xsl-1.76.1" rm -r Product mkdir -p Product/{html/{chunk/{css,images/{custom,docbook}},single/{css,images/{custom,docbook}}},pdf/images/{custom,docbook}} cp -r CSS/ Product/html/chunk/css cp -r CSS/ Product/html/single/css cp -r IMAGES/ Product/html/chunk/images/custom cp -r $DOCBOOK_XSL_DIR/images/ Product/html/chunk/images/docbook cp -r IMAGES/ Product/html/single/images/custom cp -r $DOCBOOK_XSL_DIR/images/ Product/html/single/images/docbook cp -r IMAGES/ Product/pdf/images/custom cp -r $DOCBOOK_XSL_DIR/images/ Product/pdf/images/docbook xsltproc --xinclude --output Product/html/single/SampleBook.html XSL/html.xsl Content/SampleBook.xml xsltproc --xinclude --output Product/html/chunk/SampleBook.html XSL/chunk.xsl Content/SampleBook.xml
这次的改动比较大。首先,设置了DOCBOOK_DIR、XML_CATALOG_FILES、DOCBOOK_XSL_DIR等几个环境变量,删除Product目录,按上面规划的路径分别创建目录,再将CSS文件及图像文件分别复制到相应的路径下面。最后两行的xsltproc命令保持不变。
注意DOCBOOK_DIR的设置方式与之前不同了。以前使用“file://”的文件协议方式,这种方式xsltproc可以认识,但cp命令不认识。因此改变路径方式后,双方都能接受。
现在还剩一个问题。如前所述,自动生成的HTML期待着图片在images目录下面,我们改动了这种设置,因此需要将此改动告诉DocBook。同时修改XSL目录下的chunk.xsl及html.xsl文件:
......
参数admon.graphics.path告诉DocBook,这些警示图片放在“images/docbook/”下面,注意后面必须带有“/”。参数admon.graphics.extension设置为“.png”,DocBook将查找note.png,这是默认设置。可以改为“.gif”,DocBook将查找note.gif。可看看dookbook-xsl的images目录下面都有哪些图标文件。如果需要使用自己创建的图标文件,只需将此规则命名并放在dookbook-xsl的images目录中替换掉原来的就行了。当然还需注意文件尺寸大小问题。
参数admon.textlabel控制应否出现“注意”的标题。这里因美观的原因将其屏蔽掉了。读者可设为“1”值看看效果。
运行GenHTML.sh。
比较好玩,是吧?还有更好玩的。如前所述,还有导航栏的图标呢?因为只有多网页的HTML才需要导航栏,因此,这次只修改chunk.xsl。
......
原理如前所述,只是改由参数navig.graphics及navig.graphics.path来分别控制。
挂上导航图标后,眼球、手感都立即有了不一样的感受,当然还包括幸福指数。
DocBook, do you really know how much I love you?
Shut......
OK, OK......
“您不是说过注解说明中也会有数字图标吗?怎样实现?”
Well, well...那是一个比较较劲的问题,与本文作为一个DocBook快速入门的格调不相符合,会与其他内容组成一个专题,放在另外文章中专述。
好了,自动生成HTML的故事就暂讲到这里。下一节,我们来研究另一个更激动人心的问题 ── 如何自动生成PDF文档。
生成PDF文档
初识FOP
要将DocBook的文档转换为PDF,需经两个步骤,第一步是将DocBook文档转换为.fo文档,第二步再将此.fo文档转换为.pdf文档。FOP甚至可以将此两步合为一步,直接将DocBook文档转换为PDF文档。
对于将DocBook文档转换为.fo文档的第一步,不仅FOP能完成,xsltproc也能完成。由于xsltproc的速度比FOP要快,因此,本文先使用xsltproc转换为.fo文档后,再用FOP将其转换为PDF文档。
修改catalog.xml:
...... ......
增加了fop.xsl的引用,供xsltproc调用。
在“My First Book”下面,将GenHTML.sh文件复制为GenPDF.sh文件,修改后者内容如下:
#!/bin/bash export DOCBOOK_DIR="/usr/share/xml/docbook" export XML_CATALOG_FILES="$DOCBOOK_DIR/catalog.xml" export DOCBOOK_XSL_DIR="$DOCBOOK_DIR/docbook-xsl-1.76.1" export FOP_DIR="$DOCBOOK_DIR/fop-1.0" clear xsltproc --xinclude --output Product/pdf/SampleBook.fo --stringparam fop1.extensions 1 fop.xsl Content/SampleBook.xml $FOP_DIR/fop Product/pdf/SampleBook.fo -awt
xsltproc中的fop.xsl即为刚在catalog.xml中增加的uri名称,因此,它实际调用了docbook-xsl下面的fo/docbook.xsl来将SampleBook.xml转换为SampleBook.fo文件。字符串参数fop1.extensions表示按照FOP所要求的格式来创建。例如,若将fop1.extensions设为1,则生成的PDF文档带有书签。若不设,则PDF文档没有书签。FOP V0.93及其之后版本用此参数,之前的版本用fop.extensions。
$FOP_DIR/fop调用了FOP路径下面的fop这个UNIX可执行文件,该文件负责将上一步生成的SampleBook.fo转换为PDF文档,但选项awt告诉FOP,不生成实际的PDF文档,而是直接显示出来。FOP将打开自带的一个软件来显示所创建的PDF文档。共创建了6页,下面显示的是其中有代表性的两页。
可以看出,目录部分与正文部分的页码编号采用了不同的数字。但没有节的自动编号,没有警示图标。
创建实实在在的PDF文档
水中望月,雾里观花。一会您就明白为什么了。现在,我们创建真实存在、触手可摸的PDF文档。只需改修改GenPDF.sh的最后一行。
...... $FOP_DIR/fop Product/pdf/SampleBook.fo Product/pdf/SampleBook.pdf
Oh My God! 这回您不让我叫,我跟您急!Oh My God!
第一个OMG是因为FOP自动生成了漂亮的PDF书签。第二个OMG是因为除了书签,书籍其他地方凡是应该出现中文的地方均出现了“洋文”。
原因说来话长,但长话短说就是,每个系统的字体都不一样,PDF作为一种强调可移植性的文档,正常情况下PDF文件应自带内嵌字体。FOP作为生成PDF的工具,仅自带了14种字体,远远不能满足非英文环境的需求。因此,上面生成的PDF文档在正文中凡是出现中文的地方都因为没有内嵌字体的支持而以“#”号代替。原因明白了,解决的办法也出来了,找到中文字体,嵌到其中就是。
FOP以前要嵌个字体,要自己制作比较繁琐的XML font metrics文件配置。但现在,除了这种方式之外,FOP还支持扫描特定路径的字体,以及查找系统安装字体的方式。本文使用后者。
可能是因为Mac OS X的字体规范的原因,Mac OS X中的很多中文字体不能很好地嵌入PDF文件。因此,本文中只使用到2种字体,一种是黑体,用于标题,另一种是宋体,用于正文等部分。黑体需从Windows中将simhei.ttf复制过来,这是由北京中易中标电子信息技术有限公司设计的,版权归其所有。宋体字则在Mac OS X中已有,且可正常工作,因此用它。
在Mac OS X中双击simhei.ttf,即可安装它,一般是安装到/Users/[your_name]/Library/Fonts下面,但只要安装了,就成了系统字体,而不管其安装路径。
安装完simhei.ttf后,需要让FOP来查找系统字体。在fop-1.0的conf目录下,有一个“fop.xconf”配置文件,做好备份后,将其拖至NetBeans中修改。
...... ...... ...... ......
只需在fonts标签中加入auto-detect即可。
与生成HTML文档一样,由于我们需要指定字体等定制工作,因此最好有自己的xsl转换文件。在XSL目录下将之前的html.xsl复制为pdf.xsl,并在NetBeans中编辑。
SimHei SimSun Product/pdf/images/docbook/
陌生的内容比较多。xml:fo是定制FO时经常需要用到的,虽然本文用不上,但也在此挂上了。xsl:imprt导入的方式与前面不一样了,这里使用了URI的方式。前面的html.xsl及chunk.xsl均通过绝对路径的方式来导入的,这种硬编码的方式,如果以后使用了新版的docbook-xsl之后不好维护。而使用URI,配合Catalog的配置,可以地实现缓存与维护的两相宜。这里虽然指向了网络地址,但只要在catalog.xml中进行重新导向,xsltproc就能到本地去查找fo/docbook.xsl。为达到此目的,catalog.xml内容修改如下:
...... ......
rewriteURI的工作原理是,当发现以uriStartString开始的URI时,将使用经与xml:base整合之后的rewritePrefix的字符串来代替,从而实现将网络地址重新导向到本地文件的缓存效果。这样,pdf.xsl文件中的网络地址上的fo/docbook.xsl文件,实际上被导向至本地目录下了。目前为止,包括配置给NetBeans使用的之内,我们已经使用catalog.xml来实现了4种不同的导向了,读者可慢慢体会。由见可见Catalog在XML应用中的重要性。这样改变了catalog.xml的配置后,之前的html.xsl及chunk.xsl也均可使用了这种缓存机制了。
回到pdf.xsl上。xsl:include插入了一个sharedparts.xsl文件的内容。还记得上面的html.xsl及chunk.xsl的内容吗?有许多内容是一样的,却要多次重复配置。累得不说,如果以后在一个文件中进行了修改,还得在另一个文件中重复相应的修改。很容易忘记进行同步。因此,将相同的部分抽取出来放进一个单独的文件,需要时使用xsl:include包含进来,维护时只在一处修改就好方便。
sharedparts.xsl的内容是什么?看看。
2 1 1 1 .png 1
哈哈,全是上面已经讲过的。由于这些部分,不管是html.xsl,还是chunk.xsl,或是pdf.xsl均要使用,因此就放在此共享文件中了。
html.xsl及chunk.xsl又已经改成什么样了?在此全晾出来。
先是html.xsl的内容。
xsl:import中也使用了重新导向的缓存机制。只剩下一个其独享的xsl:output了。上面又包含了一个sharedparts_html文件,顾名思义,就是所有的html的xsl文档都应共享的部分,晾完chunk.xsl内容后再晾它。chunk.xsl的内容:
除了shareparts_html.xsl,也均剩下只对chunk起作用的配置了。再看shareparts_html.xsl的内容:
它包含了sharedparts.xsl的内容,剩下的两项,均是对html.xsl及chunk.xsl有效的配置。简而言之,pdf.xsl、html.xsl及chunk.xsl均用得上的配置,放在sharedparts.xsl中,而仅对html.xsl及chunk.xsl起作用的配置,放在sharedparts_html.xsl中,最后,仅对自己有效的配置,则给自己独享。
请原谅我的这种倒插花的讲述方式。在开发过程中进行重构是非常重要而有必要的。这种讲述方式虽在接受知识效果方面略逊一筹,但它讲清了重构前的缺点,重构的过程,以及重构的最终效果,读者不仅得到了最终的成果,也从中体会到了重构的魅力及必要的技巧。
不再倒插花了,再次回到pdf.xsl上来。title.font.family指定了标题使用SimHei,即黑体字,body.font.family使用SimSun,即宋体字。运行Mac OS X中的字体册程序,点击已经安装的字体,其Postscript名称就是SimHei及SimSun的由来。
pdf.xsl虽像html.xsl及chunk.xsl一样,均共同使用admon.graphics.path,但其查找方式与另外二者不一致,是由FOP来根据GenPDF.sh的路径作为起始点来查找的,因此这项配置专门放在了pdf.xsl中。
好,繁琐的配置终于完成,开始发指令了。修改GenPDF.sh:
#!/bin/bash export DOCBOOK_DIR="/usr/share/xml/docbook" export XML_CATALOG_FILES="$DOCBOOK_DIR/catalog.xml" export DOCBOOK_XSL_DIR="$DOCBOOK_DIR/docbook-xsl-1.76.1" export FOP_DIR="$DOCBOOK_DIR/fop-1.0" clear rm Product/pdf/*.fo Product/pdf/*.pdf # xsltproc --xinclude \ # --output Product/pdf/SampleBook.fo \ # --stringparam title.font.family "SimHei" \ # --stringparam body.font.family SimSun \ # --stringparam admon.textlabel 1 \ # --stringparam admon.graphics 1 \ # --stringparam admon.graphics.path "Product/pdf/images/docbook/" \ # --stringparam header.rule 1 \ # --stringparam fop1.extensions 1 \ # fop.xsl \ # Content/SampleBook.xml xsltproc --xinclude \ --output Product/pdf/SampleBook.fo \ --stringparam fop1.extensions 1 \ XSL/pdf.xsl \ Content/SampleBook.xml $FOP_DIR/fop -c $FOP_DIR/conf/fop.xconf Product/pdf/SampleBook.fo Product/pdf/SampleBook.pdf
中间以“#”开始的部分被注释掉了,不会执行,在此说明很多参数都可以放在xsltproc的命令行中设置,与在pdf.xsl中设置的结果一样,但内容多了以后,还是建议放在pdf.xsl中设置。最后一行的fop,选项c指定了使用上面修改的fop.xconf文件中的配置来生成PDF,这样就可把查找到的字体嵌进来。
运行GenPDF.sh。
长征路漫漫,总差一步半。枝头幸运鸟,何时来伴伴。
宋体字一切正常。目录的黑体字正常。但章节部分,在应出现空格的地方,出现了“#”号。还有一个特点,即出现错误的地方,都是有自动生成内容的部分。看来是在转换文档的过程中,在需要生成新内容的地方,使用了不该使用的字符。此外,“1.1.”不规范,应为“1.1 ”。我不是事后诸葛亮,解决这些问题总会花去大量的时间,现在,求求您就让我迫不及待地直接告诉您答案吧。修改pdf.xsl文件:
......
local.l10n.xml专管本地化的工作。读取文档后,对于自动生成编号的标题,在chapter及section部位,输入符合需求的内容。%n代表数字,%t代表标题。之间的空格,采用最原始的暴力输入——使用键盘上的空格键。看来制作docbook-xsl的专家,这个老美的键盘一定是特制的。
谢幕,黯然退场。
参考资源
Filesystem Hierarchy Standard, by Rusty Russell, Daniel Quinlan, Christopher Yeoh, Filesystem Hierarchy Standard Group:http://www.pathname.com/fhs/pub/fhs-2.3.html
DocBook 5: The Definitive Guide V1.0.3 for DocBook V5.0, by Norman Walsh, XML Press:http://www.docbook.org/tdg5/en/html/docbook.html
DocBook XSL: The Complete Guide 4th Ed. by Bob Stayton, Sagehill Enterprises:http://www.sagehill.net/docbookxsl/index.html
Apache FOP 字体配置, The Apache XML Graphics Project: http://xmlgraphics.apache.org/fop/1.0/fonts.html
List of Unix utilities, Wikipedia: http://en.wikipedia.org/wiki/List_of_Unix_programs
xsltproc命令行参数, xmlsoft.org: http://xmlsoft.org/XSLT/xsltproc.html
XML 1.0 Recommendation, World Wide Web Consortium (W3C): http://www.w3.org/TR/2008/REC-xml-20081126/
w3schools.com: http://www.w3schools.com/
Entity Declarations, Attributes and Expansion, by Norman Walsh, O'REILLY xml.com:http://www.xml.com/pub/a/98/08/xmlqna2.html
HTML Paramter Refernce, DocBook XSL Stylesheets: Reference Documentation, by Norman Walsh, The DocBook Project:http://docbook.sourceforge.net/release/xsl/current/doc/html/
Fo Paramter Refernce, DocBook XSL Stylesheets: Reference Documentation, by Norman Walsh, The DocBook Project:http://docbook.sourceforge.net/release/xsl/current/doc/fo/
附录
附录A 字符实体符号表 [进度:7 / 19]
iso-amsa.ent [56个表示关系的箭头符号]
实体名称
实体符号
cularr
↶
curarr
↷
dArr
⇓
darr2
⇊
dharl
⇃
dharr
⇂
lAarr
⇚
Larr
↞
larr2
⇇
larrhk
↩
larrlp
↫
larrtl
↢
lhard
↽
lharu
↼
hArr
⇔
harr
↔
lrarr2
⇆
rlarr2
⇄
harrw
↭
rlhar2
⇌
lrhar2
⇋
lsh
↰
map
↦
mumap
⊸
nearr
↗
nlArr
⇍
nlarr
↚
nhArr
⇎
nharr
↮
nrarr
↛
nrArr
⇏
nwarr
↖
olarr
↺
orarr
↻
rAarr
⇛
Rarr
↠
rarr2
⇉
rarrhk
↪
rarrlp
↬
rarrtl
↣
rarrw
↝
rhard
⇁
rharu
⇀
rsh
↱
drarr
↘
dlarr
↙
uArr
⇑
uarr2
⇈
vArr
⇕
varr
↕
uharl
↿
uharr
↾
xlArr
⇐
xhArr
↔
xharr
↔
xrArr
⇒
iso-amsb.ent [42个表示二进制操作符的符号]
实体名称
实体符号
amalg
∐
Barwed
⌆
barwed
⊼
Cap
⋒
Cup
⋓
cuvee
⋎
cuwed
⋏
diam
⋄
divonx
⋇
intcal
⊺
lthree
⋋
ltimes
⋉
minusb
⊟
oast
⊛
ocir
⊚
odash
⊝
odot
⊙
ominus
⊖
oplus
⊕
osol
⊘
otimes
⊗
plusb
⊞
plusdo
∔
rthree
⋌
rtimes
⋊
sdot
⋅
sdotb
⊡
setmn
∖
sqcap
⊓
sqcup
⊔
ssetmn
∖
sstarf
⋆
timesb
⊠
top
⊤
uplus
⊎
wreath
≀
xcirc
○
xdtri
▽
xutri
△
coprod
∐
prod
∏
sum
∑
iso-amsc.ent [9个表示分界的符号]
实体名称
实体符号
rceil
⌉
rfloor
⌋
rpargt
urcorn
⌝
drcorn
⌟
lceil
⌈
lfloor
⌊
ulcorn
⌜
dlcorn
⌞
iso-amsn.ent [59个表示不等的数学符号]
实体名称
实体符号
gnap
gne
≩
gnE
≩
gnsim
⋧
gvnE
≩
lnap
lnE
≨
lne
≨
lnsim
⋦
lvnE
≨
nap
≉
ncong
≇
nequiv
≢
ngE
≱
nge
≱
nges
≱
ngt
≯
nle
≰
nlE
≰
nles
≰
nlt
≮
nltri
⋪
nltrie
⋬
nmid
∤
npar
∦
npr
⊀
npre
⋠
nrtri
⋫
nrtrie
⋭
nsc
⊁
nsce
⋡
nsim
≁
nsime
≄
nsmid
nspar
∦
nsub
⊄
nsube
⊈
nsubE
⊈
nsup
⊅
nsupE
⊉
nsupe
⊉
nvdash
⊬
nvDash
⊭
nVDash
⊯
nVdash
⊮
prnap
⋨
prnE
prnsim
⋨
scnap
⋩
scnE
scnsim
⋩
subne
⊊
subnE
⊊
supne
⊋
supnE
⊋
vsubnE
vsubne
⊊
vsupne
⊋
vsupnE
⊋
iso-amso.ent [18个数学符号]
实体名称
实体符号
ang
∠
angmsd
∡
beth
ℶ
bprime
‵
comp
∁
daleth
ℸ
ell
ℓ
empty
∅
gimel
ℷ
image
ℑ
inodot
ı
nexist
∄
oS
Ⓢ
planck
ℏ
real
ℜ
sbsol
﹨
vprime
′
weierp
℘
iso-amsr.ent [84个表示关系的数学符号]
实体名称
实体符号
ape
≊
asymp
≍
bcong
≌
bepsi
∍
bowtie
⋈
bsim
∽
bsime
⋍
bump
≎
bumpe
≏
cire
≗
colone
≔
cuepr
⋞
cuesc
⋟
cupre
≼
dashv
⊣
ecir
≖
ecolon
≕
eDot
≑
esdot
≐
efDot
≒
egs
⋝
els
⋜
erDot
≓
fork
⋔
frown
⌢
gap
≳
gsdot
⋗
gE
≧
gel
⋛
gEl
⋛
ges
≥
Gg
⋙
gl
≷
gsim
≳
Gt
≫
lap
≲
ldot
⋖
lE
≦
lEg
⋚
leg
⋚
les
≤
lg
≶
Ll
⋘
lsim
≲
Lt
≪
ltrie
⊴
mid
∣
models
⊧
pr
≺
prap
≾
pre
≼
prsim
≾
rtrie
⊵
samalg
∐
sc
≻
scap
≿
sccue
≽
sce
≽
scsim
≿
sfrown
⌢
smid
smile
⌣
spar
∥
sqsub
⊏
sqsube
⊑
sqsup
⊐
sqsupe
⊒
ssmile
⌣
Sub
⋐
subE
⊆
Sup
⋑
supE
⊇
thkap
≈
thksim
∼
trie
≜
twixt
≬
vdash
⊢
Vdash
⊩
vDash
⊨
veebar
⊻
vltri
⊲
vprop
∝
vrtri
⊳
Vvdash
⊪
iso-box.ent [40个画边框线的符号]
实体名称
实体符号
boxh
─
boxv
│
boxur
└
boxul
┘
boxdl
┐
boxdr
┌
boxvr
├
boxhu
┴
boxvl
┤
boxhd
┬
boxvh
┼
boxvR
╞
boxhU
╧
boxvL
╡
boxhD
╤
boxvH
╪
boxH
═
boxV
║
boxUR
╘
boxUL
╛
boxDL
╕
boxDR
╒
boxVR
╟
boxHU
╨
boxVL
╢
boxHD
╥
boxVH
╫
boxVr
╠
boxHu
╩
boxVl
╣
boxHd
╦
boxVh
╬
boxuR
╙
boxUl
╜
boxdL
╖
boxDr
╓
boxUr
╚
boxuL
╝
boxDl
╗
boxdR
╔
符号很多,不可能在一个XML文档中全部都用上,可根据实际需要进行取舍。
你可能感兴趣的:(DocBook 5 快速起步教程)
项目平台哪个靠谱?推荐5个真实靠谱且赚钱的软件app!
U客直谈APP
对于想要创业赚钱的朋友来说,能够对接到优质项目是提升收益的重要因素,有关项目对接的渠道方式有很多,利用平台软件是便捷且高效的一种。因此,项目平台哪个靠谱是大家一直较为关注的问题。现如今赚钱的软件app席卷市面,也可以看做是一个个项目平台,为大家提供了丰富的赚钱机会。今天我将和大家分享5个真实靠谱且赚钱的软件app,希望能够帮助大家顺利找到靠谱的项目平台。1:抖音极速版app抖音极速版app是抖音旗
约练收获(517~518)
胡晓会
胡晓会中原焦点,高级七期讲师八期中级九期、心理咨询师婚姻家庭咨询师2021.11.13坚持分享第1346天第517场自3.26以来做咨询师88次,目标100次六年级学生实地心理疏导。建立关系很重要。尊重学生的各种感受以及他的有所保留不断确认知觉该阳谋时就阳谋眼里有来访者不要期待做一次就能有很多的改变,或者希望让学生明白的道理无论何时,来访者的感受想法在乎看重想要的以及做的努力都是很重要的。第518
sqlite加密问题:怎么样打开这个通过sha512加密的sqlite数据库文件?
bug菌¹
全栈Bug调优(实战版) sqlite c++ sqlite加密 数据库文件
本文收录于《全栈Bug调优(实战版)》专栏,主要记录项目实战过程中所遇到的Bug或因后果及提供真实有效的解决方案,希望能够助你一臂之力,帮你早日登顶实现财富自由;同时,欢迎大家关注&&收藏&&订阅!持续更新中,up!up!up!!全文目录:问题描述解决方案1.**理解SQLite的加密扩展**2.**确认加密实现方式**3.**根据SHA-512的加密逻辑调整代码**4.**解决方案步骤****方
2022-08-05
方方1976
2022.8.5中原焦点网初36期方海燕603天分享小侄子回家来过十岁生日,正好有机会休假,耶。下午睡到三点,起来迅速收拾好东西,三点四十五出门,动作麻利。一路上儿子一人开车,稳稳当当,不急不躁,小伙子成熟稳重。一到家,看着一屋子的亲人,满满的幸福感感谢儿子开车送我回娘家,感谢老爸老妈用鸡汤欢迎我。
宝妈兼职群哪些兼职适合在家工作(宝妈们的优选兼职)
幸运副业
宝妈兼职群哪些兼职适合在家工作(宝妈们的优选兼职)越来越多的宝妈们选择在家工作,以更好地照顾家庭和孩子。而宝妈兼职群成为她们分享工作机会、经验的重要平台。在这篇文章中,我们将探讨哪些兼职适合在家工作,以及为宝妈们提供的优选兼职机会。推荐一篇找兼职必看的免费教程:《手机兼职,300-500/天,一单一结,大量要人》在这里可以找到各种打字聊天员兼职,视频编辑兼职,小说抄写兼职等适合大家的岗位。1.在家
python的signal
weixin_33690963
python
今天在使用python的signal时,发现第二个传的函数必须是拥有两个函数参数变量的1importsignal2importtime3flag=True4deffunc1(a,b):5print"recieveSIGTERM"6globalflag7print"flag%s"%flag8flag=False9print"flag%s"%flag101112defmain():13signal.s
Python 轻量化环境管理利器 UV 入门与 Windows 下安装实战
wangjinjin180
python uv windows
https://www.52runoob.com/index.php/2025/06/19/python-轻量化环境管理利器-uv-入门与-windows-下安装实战/Python轻量化环境管理利器UV入门与Windows下安装实战一、什么是UV(UnikernelVirtualization)UV是一种轻量化的虚拟化技术,能够将应用程序与操作系统内核打包为一个单一的运行镜像,极大减少系统资源占用
游戏UI开发之路:复盘从Flash黄金时代到Unity UI Toolkit的漫漫长路(5)
伽蓝_游戏
游戏UI开发 游戏 ui unity
第五章:终章与新篇——在永无止境的道路上,眺望下一个十年从Flash页游的喧嚣时代,到引擎王权的更迭与“第三极”的百家争鸣,我们一同穿越了游戏UI技术发展史上波澜壮阔的十余年。当历史的尘埃落定,回望这条漫漫长路,几条清晰而深刻的技术脉络,如山脉般贯穿了整个时代,并清晰地指向了未来的方向。5.1历史的回响:驱动技术演进的三大主旋律在这场永不停歇的技术演进中,有三个核心的“主旋律”在反复奏响,它们是理
centos 根目录扩容
利伊奥克儿
添加一块磁盘参考上一篇博文VMwareWorkstation添加磁盘挂载目录(centos)查看当前磁盘挂载情况[root@node1~]#fdisk-lDisk/dev/sda:536.9GB,536870912000bytes,1048576000sectorsUnits=sectorsof1*512=512bytesSectorsize(logical/physical):512bytes/
打卡信奥刷题(1150)用C++实现信奥 P2085 最小函数值
P2085最小函数值题目描述有nnn个函数,分别为F1,F2,…,FnF_1,F_2,\dots,F_nF1,F2,…,Fn。定义Fi(x)=Aix2+Bix+Ci(x∈N∗)F_i(x)=A_ix^2+B_ix+C_i(x\in\mathbbN*)Fi(x)=Aix2+Bix+Ci(x∈N∗)。给定这些AiA_iAi、BiB_iBi和CiC_iCi,请求出所有函数的所有函数值中最小的mmm个(如
2020-03-03
水晶人生
2020—3-3星期二分享265天本周约第0次约练共119次焦点学了这么久,感觉到了现实中往往情绪一上来什么都忘了。昨天晚上九点多,我用旧手机翻看钉钉作业情况,不看还好一看,儿子语文英语作业都没有交,班里只剩儿子没交了,儿子总是最后交作业,而且质量也不高,群里老师每天都表扬作业优秀的孩子,很少有儿子的名字出现,唉!儿子咋说也是班里前十名,这个也就算了,做事从来都不知道认真两字的儿子,这个我也能接受
随记44
一程山水一程歌_c0bf
学习柳井正的《经营者养成笔记》随想35121.柳井正在赚钱的能力的第六节《与矛盾做斗争》中提到要“发现真正的问题,从根本上解决问题”,能够发现真正的问题并不是很容易的事情,如果格局、视野不够,或者所处的环节不够,要发现真正的问题,知道问题的核心是很难的。核心还是管理者的格局,只有管理者有了足够大的格局,才可能创造出培养优秀的经营者的环境和平台。
亲子日记第105天
杜若菲妈妈
2018年5月27日星期天晴今天小宝上千字文课的时候,有个画人物的环节,忽然一个小女孩激动的又哭又闹的往外跑,把我们都整蒙了。问题是她妈妈还不在,送下孩子去买东西了,把老师难为的不轻。后来才知道,原来是她看到那个人物画害怕,简直是恐惧,看起来都有些病态了,很是可怜。一个四五岁的孩子,能被一个画吓成那样,这是父母的失责!我们做父母的,光有一颗爱孩子的心❤️还远远不够,孩子需要父母实实在在的陪伴,参与
虚拟机中 Linux环境下idea 报Java HotSpot(TM) 64-Bit Server VM warning: ignoring option MaxPermSize=350m;
秋林辉
JAVA idea linux jdk intellij idea
问题JavaHotSpot(TM)64-BitServerVMwarning:ignoringoptionMaxPermSize=350m;supportwasremovedin8.0无法启动原因在Java8中,命令行标志MaxPermSize已被删除。原因是永久代已从热点堆中删除,并已移至本机内存。所以不需要配置,内存足够!第一先看看你是不是使用JDK8,如果是MaxPermSize这个配置无效
2019-03-26
泰优汇典当行车贷李娟18221
1:付出不亚于任何人的努力2.要谦虚,不要骄傲3.要每天反省4.活着,就要感谢5.积善行,思利他6不要有感性的烦恼今日分享:所谓不可能,只是现在的自己不可能,对将来的自己而言那是“可能”的。应该用这种“将来时行时”来思考。要相信我们具备还没有发挥出来的巨大力量。“行!我们能做。”衡量自己的能力要用“将来进行时”,用这种积极的态度对待工作。----稻盛和夫
读《上下五千年》有感
林子的阅读时光
解放街小学四年级(5)班石谨铭中国五千年历史,是每个炎黄子孙,都非常骄傲的。而中国历史,不仅留下了丰富的文化遗产,还留下了老祖宗的智慧,不仅有《论语》《孟子》《墨子》《春秋》等历史学说。还有《孙子兵法》等著名兵法。《上下五千年》这本书总结了中华民族5000年历史,留下了许许多多的历史人物。中华历史中有明君唐太宗,也有暴君纣王,有可歌可泣的秦始皇,也有卧薪尝胆的越王勾践。当然,那些英雄们有悲壮的荆轲
51单片机 定时器时钟
微芬
51单片机 51单片机 单片机
本章博客实现在LCD1602上展示定时器时钟部分1.main.c注:Sec,Min,Hour可不进行赋值#include#include"Delay.h"#include"LCD1602.h"#include"Timer0.h"unsignedcharSec=55,Min=59,Hour=23;voidmain(){LCD_Init();Timer0Init();LCD_ShowString(1,
软路由 + 代理 IP 实现多手机不同公网 IP 分配教程
九州ip动态
tcp/ip 智能手机 网络协议
本文将详细介绍如何通过软路由结合代理IP,实现多台手机各自获取不同公网IP,步骤清晰可落地。一,应用场景1.例如手游工作室,为避免游戏检测系统制裁,需要一台设备一个IP,此时可通过实体机搭建ROS软路由,配合兔子IP,2.使每个手机连接不同的WiFi,实现每个WiFi对应一个独立IP,相互之间无关联,就如同每个WiFi都是一个遍布在全国各地的家庭路由器。二,选择软路由和代理IP服务1.软路由选择:
2022-05-03
不一样的烟火100
人际交往中,什么样的人最受欢迎?有趣,会玩。同学中有个小圈子,有男有女,隔三岔五会有个饭局,或为某人庆祝生日,或贺某人乔迁之喜,或祝子女金榜题名,或庆祝某人嫁女招婿……一群人乌泱泱聚集一起,谈天说地,把酒言欢。其中总会有个核心人物搞气氛,只见他八面玲珑,照顾每个人,什么话题都能扯几句,其间夹杂一半句或诙谐幽默的笑话,或流行网络语,或就社会热间发表高论,最不济也来两句原创的黑色幽默,逗得一桌人爆笑不
2023-07-23
弗莱斯曼
凡事预则立,不预则废。记忆力以及理解能力,需要不断的用事情去打磨,越磨越灵光,越刺激越好用。不是在总结,就是在总结的路上。把自己的事情束之高阁的人将终生痛苦。闲言碎语1、上午过去澳新羽毛球馆参加了自己每周都特别期待的活动,这次碰到对的搭档玩的极其酣畅淋漓,基本上整个上午场能妥妥达到50%以上的胜率;简单的小复盘下,针对边线球,自己在处理的时候,除了要把球打到对面足够深的位置,还需要适当的对球做下控
中断定时器60秒倒计时
爱摆烂的谢谢谢
单片机 嵌入式硬件 51单片机 物联网 c语言
#include//数码管位选控制引脚定义sbitSEG1=P2^2;sbitSEG2=P2^3;sbitSEG3=P2^4;//按键和蜂鸣器引脚定义sbitK1=P3^2;sbitBuzzer=P1^5;//全局变量定义unsignedintsec=60;//倒计时秒数unsignedintcount=0;//定时器计数bitis_counting=0;//倒计时状态标志/***@brief毫秒
高端密码学院笔记228
柚子_b4b4
高端幸福密码学院(高级班)幸福使者:李华第(541)期《幸福》之启动深层心理轻松意识基础篇——“扛得住”成长的喜悦心理案例分析主讲:刘莉一,知识扩充:高尚、伟大的代价就是责任。自由的第一个意义就是担负自己的责任2020.8.20星期三一笔记:1.从接的住到扛得住,心里境界的提升2.看到优秀的家人向别人学习如何去做,什么心里阶段性呈现什么状态。3.学习力越强,承载力越强4.精准,准确,的点评就是对笔
前端15
徒做嫁衣
jquery用法思想一选择某个网页元素,然后对它进行某种操作。jquery选择器jquery选择器可以快速地选择元素,选择规则和css样式相同,使用length属性判断是否选择成功。$(document)//选择整个文档对象$('li')//选择所有的li元素$('#myId')//选择id为myId的网页元素$('.myClass')//选择class为myClass的元素$('input[na
2022年6月时间开销总结与计划
克克克阿
2022年6月本月的重心就是实习工作,没别的了。下月计划:7月份确定好机票事宜,7月底看看父母和老朋友,再找点课上。睡眠休息:244h2m。日均8.13小时,平均每天再加上午休40分钟左右,大概日剧8.8小时。工作:222h28m。日均工作8.5-9小时左右。吃漱杂事:72h5m。主要是四个周末每天日均6小时左右,工作日一般没算。运动:66h58m。打羽毛球大概20次,付费的大概15次,有一周每天
十大赚钱软件排名:这十款软件赚钱又快又多
优惠券高省
赚钱软件哪个赚钱多?现在互联网时代,每天都有越来越多的人用手机赚钱软件来做副业赚钱。比如我通过手机赚钱软件赚钱已经好几年了。所以我很清楚一个赚钱软件能不能快速赚钱,现在基本都是选择一些靠谱的快速赚钱的软件来做。下面就来和大家分享5个赚钱多的赚钱软件,希望能帮到大家。1、「高省APP」推广app赚钱(高省邀请码:668666)推广app赚钱的形式在众多的网上赚钱方式中收益算是比较好的,做得好了月入过
大一暑假适合学51单片机吗?
淘晶驰AK
51单片机 嵌入式硬件 单片机
大一暑假学51单片机,简直是老天爷赏饭吃的黄金窗口。我当时就是靠着这两个月,把从课本上看来的C语言指针、循环语句,变成了能让LED按节奏跳舞的真本事。学期里总被高数作业和英语背单词挤得没整块时间,焊个电路板还得算着实验室关门时间。暑假就不一样了,早上自然醒后泡杯咖啡,搬个小桌子到阳台,开发板一铺就是一整天。记得第一次烧写程序时,手抖着插杜邦线,结果把VCC接到了GND,开发板瞬间冒出股焦味——后来
hamburger-react项目安装与使用指南
毕腾鉴Goddard
hamburger-react项目安装与使用指南项目简介本指南旨在帮助开发者了解并快速上手hamburger-react项目。该项目托管在GitHub上,可通过此链接访问。它是一个基于React的组件库,专注于实现汉堡菜单效果,为Web应用提供简洁易用的导航解决方案。1.项目目录结构及介绍hamburger-react/│├──public/-包含index.html以及可能的静态资源,如图标或初
VSCode WebView React 开源项目实战指南
廉珏俭Mercy
VSCodeWebViewReact开源项目实战指南本指南旨在帮助您了解并快速上手vscode-webview-react开源项目,该项目提供了一个基于React和TypeScript的起点,用于在VisualStudioCode的Webview中开发扩展。以下是核心模块的详细介绍:1.项目目录结构及介绍├──package.json//项目配置文件,包括依赖、scripts命令等├──publi
【Java从入门到起飞】初始Java
I'm Joe
Java java 开发语言
文章目录1.Java语言概述1.1Java概述1.2Java语言简史1.3Java之父1.4Java技术体系平台1.5java的主要特性2.Java开发环境2.1Java语言跨平台的原理2.2什么是JDK、JRE、JVM2.3JDK的目录介绍3.注释(comment)4.JavaAPI文档5.Java核心机制:JVM5.1Java语言的优缺点5.1.1优点5.1.2缺点5.2JVM功能说明5.2.
2020-04-29 eMAGMA 基于基因的关联分析(Part1)
程凉皮儿
输入数据准备本教程要求eMAGMA文件,软件(MAGMA)和辅助文件都在同一个目录下如果你的文件在不同的目录上,请在命令行加入路径信息cd/path/yourworkingfolder/eMAGMA解压缩软件包及辅助文件:magma_v1.07b.zip,NCBI37.3.zip和MDD2018_excluding23andMe(下载自PGCwebsite).unzip[filename].zip
深入浅出Java Annotation(元注解和自定义注解)
Josh_Persistence
Java Annotation 元注解 自定义注解
一、基本概述
Annontation是Java5开始引入的新特征。中文名称一般叫注解。它提供了一种安全的类似注释的机制,用来将任何的信息或元数据(metadata)与程序元素(类、方法、成员变量等)进行关联。
更通俗的意思是为程序的元素(类、方法、成员变量)加上更直观更明了的说明,这些说明信息是与程序的业务逻辑无关,并且是供指定的工具或
mysql优化特定类型的查询
annan211
java 工作 mysql
本节所介绍的查询优化的技巧都是和特定版本相关的,所以对于未来mysql的版本未必适用。
1 优化count查询
对于count这个函数的网上的大部分资料都是错误的或者是理解的都是一知半解的。在做优化之前我们先来看看
真正的count()函数的作用到底是什么。
count()是一个特殊的函数,有两种非常不同的作用,他可以统计某个列值的数量,也可以统计行数。
在统
MAC下安装多版本JDK和切换几种方式
棋子chessman
jdk
环境:
MAC AIR,OS X 10.10,64位
历史:
过去 Mac 上的 Java 都是由 Apple 自己提供,只支持到 Java 6,并且OS X 10.7 开始系统并不自带(而是可选安装)(原自带的是1.6)。
后来 Apple 加入 OpenJDK 继续支持 Java 6,而 Java 7 将由 Oracle 负责提供。
在终端中输入jav
javaScript (1)
Array_06
JavaScript java 浏览器
JavaScript
1、运算符
运算符就是完成操作的一系列符号,它有七类: 赋值运算符(=,+=,-=,*=,/=,%=,<<=,>>=,|=,&=)、算术运算符(+,-,*,/,++,--,%)、比较运算符(>,<,<=,>=,==,===,!=,!==)、逻辑运算符(||,&&,!)、条件运算(?:)、位
国内顶级代码分享网站
袁潇含
java jdk oracle .net PHP
现在国内很多开源网站感觉都是为了利益而做的
当然利益是肯定的,否则谁也不会免费的去做网站
&
Elasticsearch、MongoDB和Hadoop比较
随意而生
mongodb hadoop 搜索引擎
IT界在过去几年中出现了一个有趣的现象。很多新的技术出现并立即拥抱了“大数据”。稍微老一点的技术也会将大数据添进自己的特性,避免落大部队太远,我们看到了不同技术之间的边际的模糊化。假如你有诸如Elasticsearch或者Solr这样的搜索引擎,它们存储着JSON文档,MongoDB存着JSON文档,或者一堆JSON文档存放在一个Hadoop集群的HDFS中。你可以使用这三种配
mac os 系统科研软件总结
张亚雄
mac os
1.1 Microsoft Office for Mac 2011
大客户版,自行搜索。
1.2 Latex (MacTex):
系统环境:https://tug.org/mactex/
&nb
Maven实战(四)生命周期
AdyZhang
maven
1. 三套生命周期 Maven拥有三套相互独立的生命周期,它们分别为clean,default和site。 每个生命周期包含一些阶段,这些阶段是有顺序的,并且后面的阶段依赖于前面的阶段,用户和Maven最直接的交互方式就是调用这些生命周期阶段。 以clean生命周期为例,它包含的阶段有pre-clean, clean 和 post
Linux下Jenkins迁移
aijuans
Jenkins
1. 将Jenkins程序目录copy过去 源程序在/export/data/tomcatRoot/ofctest-jenkins.jd.com下面 tar -cvzf jenkins.tar.gz ofctest-jenkins.jd.com &
request.getInputStream()只能获取一次的问题
ayaoxinchao
request Inputstream
问题:在使用HTTP协议实现应用间接口通信时,服务端读取客户端请求过来的数据,会用到request.getInputStream(),第一次读取的时候可以读取到数据,但是接下来的读取操作都读取不到数据
原因: 1. 一个InputStream对象在被读取完成后,将无法被再次读取,始终返回-1; 2. InputStream并没有实现reset方法(可以重
数据库SQL优化大总结之 百万级数据库优化方案
BigBird2012
SQL优化
网上关于SQL优化的教程很多,但是比较杂乱。近日有空整理了一下,写出来跟大家分享一下,其中有错误和不足的地方,还请大家纠正补充。
这篇文章我花费了大量的时间查找资料、修改、排版,希望大家阅读之后,感觉好的话推荐给更多的人,让更多的人看到、纠正以及补充。
1.对查询进行优化,要尽量避免全表扫描,首先应考虑在 where 及 order by 涉及的列上建立索引。
2.应尽量避免在 where
jsonObject的使用
bijian1013
java json
在项目中难免会用java处理json格式的数据,因此封装了一个JSONUtil工具类。
JSONUtil.java
package com.bijian.json.study;
import java.util.ArrayList;
import java.util.Date;
import java.util.HashMap;
[Zookeeper学习笔记之六]Zookeeper源代码分析之Zookeeper.WatchRegistration
bit1129
zookeeper
Zookeeper类是Zookeeper提供给用户访问Zookeeper service的主要API,它包含了如下几个内部类
首先分析它的内部类,从WatchRegistration开始,为指定的znode path注册一个Watcher,
/**
* Register a watcher for a particular p
【Scala十三】Scala核心七:部分应用函数
bit1129
scala
何为部分应用函数?
Partially applied function: A function that’s used in an expression and that misses some of its arguments.For instance, if function f has type Int => Int => Int, then f and f(1) are p
Tomcat Error listenerStart 终极大法
ronin47
tomcat
Tomcat报的错太含糊了,什么错都没报出来,只提示了Error listenerStart。为了调试,我们要获得更详细的日志。可以在WEB-INF/classes目录下新建一个文件叫logging.properties,内容如下
Java代码
handlers = org.apache.juli.FileHandler, java.util.logging.ConsoleHa
不用加减符号实现加减法
BrokenDreams
实现
今天有群友发了一个问题,要求不用加减符号(包括负号)来实现加减法。
分析一下,先看最简单的情况,假设1+1,按二进制算的话结果是10,可以看到从右往左的第一位变为0,第二位由于进位变为1。
 
读《研磨设计模式》-代码笔记-状态模式-State
bylijinnan
java 设计模式
声明: 本文只为方便我个人查阅和理解,详细的分析以及源代码请移步 原作者的博客http://chjavach.iteye.com/
/*
当一个对象的内在状态改变时允许改变其行为,这个对象看起来像是改变了其类
状态模式主要解决的是当控制一个对象状态的条件表达式过于复杂时的情况
把状态的判断逻辑转移到表示不同状态的一系列类中,可以把复杂的判断逻辑简化
如果在
CUDA程序block和thread超出硬件允许值时的异常
cherishLC
CUDA
调用CUDA的核函数时指定block 和 thread大小,该大小可以是dim3类型的(三维数组),只用一维时可以是usigned int型的。
以下程序验证了当block或thread大小超出硬件允许值时会产生异常!!!GPU根本不会执行运算!!!
所以验证结果的正确性很重要!!!
在VS中创建CUDA项目会有一个模板,里面有更详细的状态验证。
以下程序在K5000GPU上跑的。
诡异的超长时间GC问题定位
chenchao051
jvm cms GC hbase swap
HBase的GC策略采用PawNew+CMS, 这是大众化的配置,ParNew经常会出现停顿时间特别长的情况,有时候甚至长到令人发指的地步,例如请看如下日志:
2012-10-17T05:54:54.293+0800: 739594.224: [GC 739606.508: [ParNew: 996800K->110720K(996800K), 178.8826900 secs] 3700
maven环境快速搭建
daizj
安装 mavne 环境配置
一 下载maven
安装maven之前,要先安装jdk及配置JAVA_HOME环境变量。这个安装和配置java环境不用多说。
maven下载地址:http://maven.apache.org/download.html,目前最新的是这个apache-maven-3.2.5-bin.zip,然后解压在任意位置,最好地址中不要带中文字符,这个做java 的都知道,地址中出现中文会出现很多
PHP网站安全,避免PHP网站受到攻击的方法
dcj3sjt126com
PHP
对于PHP网站安全主要存在这样几种攻击方式:1、命令注入(Command Injection)2、eval注入(Eval Injection)3、客户端脚本攻击(Script Insertion)4、跨网站脚本攻击(Cross Site Scripting, XSS)5、SQL注入攻击(SQL injection)6、跨网站请求伪造攻击(Cross Site Request Forgerie
yii中给CGridView设置默认的排序根据时间倒序的方法
dcj3sjt126com
GridView
public function searchWithRelated() {
$criteria = new CDbCriteria;
$criteria->together = true; //without th
Java集合对象和数组对象的转换
dyy_gusi
java集合
在开发中,我们经常需要将集合对象(List,Set)转换为数组对象,或者将数组对象转换为集合对象。Java提供了相互转换的工具,但是我们使用的时候需要注意,不能乱用滥用。
1、数组对象转换为集合对象
最暴力的方式是new一个集合对象,然后遍历数组,依次将数组中的元素放入到新的集合中,但是这样做显然过
nginx同一主机部署多个应用
geeksun
nginx
近日有一需求,需要在一台主机上用nginx部署2个php应用,分别是wordpress和wiki,探索了半天,终于部署好了,下面把过程记录下来。
1. 在nginx下创建vhosts目录,用以放置vhost文件。
mkdir vhosts
2. 修改nginx.conf的配置, 在http节点增加下面内容设置,用来包含vhosts里的配置文件
#
ubuntu添加admin权限的用户账号
hongtoushizi
ubuntu useradd
ubuntu创建账号的方式通常用到两种:useradd 和adduser . 本人尝试了useradd方法,步骤如下:
1:useradd
使用useradd时,如果后面不加任何参数的话,如:sudo useradd sysadm 创建出来的用户将是默认的三无用户:无home directory ,无密码,无系统shell。
顾应该如下操作:
第五章 常用Lua开发库2-JSON库、编码转换、字符串处理
jinnianshilongnian
nginx lua
JSON库
在进行数据传输时JSON格式目前应用广泛,因此从Lua对象与JSON字符串之间相互转换是一个非常常见的功能;目前Lua也有几个JSON库,本人用过cjson、dkjson。其中cjson的语法严格(比如unicode \u0020\u7eaf),要求符合规范否则会解析失败(如\u002),而dkjson相对宽松,当然也可以通过修改cjson的源码来完成
Spring定时器配置的两种实现方式OpenSymphony Quartz和java Timer详解
yaerfeng1989
timer quartz 定时器
原创整理不易,转载请注明出处:Spring定时器配置的两种实现方式OpenSymphony Quartz和java Timer详解
代码下载地址:http://www.zuidaima.com/share/1772648445103104.htm
有两种流行Spring定时器配置:Java的Timer类和OpenSymphony的Quartz。
1.Java Timer定时
首先继承jav
Linux下df与du两个命令的差别?
pda158
linux
一、df显示文件系统的使用情况,与du比較,就是更全盘化。 最经常使用的就是 df -T,显示文件系统的使用情况并显示文件系统的类型。 举比例如以下: [root@localhost ~]# df -T Filesystem Type &n
[转]SQLite的工具类 ---- 通过反射把Cursor封装到VO对象
ctfzh
VO android sqlite 反射 Cursor
在写DAO层时,觉得从Cursor里一个一个的取出字段值再装到VO(值对象)里太麻烦了,就写了一个工具类,用到了反射,可以把查询记录的值装到对应的VO里,也可以生成该VO的List。
使用时需要注意:
考虑到Android的性能问题,VO没有使用Setter和Getter,而是直接用public的属性。
表中的字段名需要和VO的属性名一样,要是不一样就得在查询的SQL中
该学习笔记用到的Employee表
vipbooks
oracle sql 工作
这是我在学习Oracle是用到的Employee表,在该笔记中用到的就是这张表,大家可以用它来学习和练习。
drop table Employee;
-- 员工信息表
create table Employee(
-- 员工编号
EmpNo number(3) primary key,
-- 姓