我需要输出一些十六进制数据,其中一些字节用彩色背景突出显示。表示红色值的数据中的字节应具有红色背景。这就是我选择
的原因<emphasis role="red"></emphasis>
成为首选标签。
对于HTML输出,我使用
<xsl:param name="emphasis.propagates.style" select="1"/>
xsl文件中的和
.red {
background-color: red;
}
样式表中的。 这完美无缺。
对于PDF输出,我使用dblatex并尝试(文件fo.xsl)
<?xml version="1.0" encoding="UTF-8"?>
<xsl:stylesheet xmlns:xsl="http://www.w3.org/1999/XSL/Transform"
xmlns:fo="http://www.w3.org/1999/XSL/Format"
xmlns:d="http://docbook.org/ns/docbook"
xmlns="http://www.w3.org/TR/xhtml1/transitional"
version="1.0">
<xsl:param name="draft.mode">no</xsl:param>
<xsl:param name="imagedata.default.scale">maxwidth=12cm</xsl:param>
<xsl:template match="emphasis[@role='red']">
<xsl:param name="content">
<xsl:apply-templates/>
</xsl:param>
<xsl:text>{\color{red}</xsl:text>
<xsl:copy-of select="$content"/>
<xsl:text>}</xsl:text>
</xsl:template>
</xsl:stylesheet>
和(file test.xml)
<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE book PUBLIC "-//OASIS//DTD DocBook XML V4.3//EN"
"http://www.oasis-open.org/docbook/xml/4.3/docbookx.dtd">
<article lang="en">
<title>Test</title>
<para>
<screen>0240h: 00 20 <emphasis role="red">00</emphasis> 21</screen>
</para>
</article>
使用以下命令构建用于检查的乳胶源:
dblatex --backend=pdftex --xslt=xsltproc \
--input-format=xml --type=tex \
--xsl-user=fo.xsl --verbose --output=test.tex test.xml
这不起作用。强调文本仍然是斜体,如结果test.tex中的摘录所示:
\begin{lstlisting}[firstnumber=1,escapeinside={<t>}{</t>},moredelim={**[is][\bfseries]{<b>}{</b>}},moredelim={**[is][\itshape]{<i>}{</i>}},]
0240h: 00 20 <i>00</i> 21\end{lstlisting}
我做错了什么?
答案 0 :(得分:2)
正如mzjn所说,屏幕标签是个问题。在阅读链接资源之后,在这种情况下适合我的最终模板,并产生类似于html外观的输出,是:
<xsl:template match="emphasis[@role='red']" mode="latex.programlisting">
<xsl:param name="co-tagin" select="'<:'"/>
<xsl:param name="rnode" select="/"/>
<xsl:param name="probe" select="0"/>
<xsl:param name="content">
<xsl:apply-templates/>
</xsl:param>
<xsl:text><t>\colorbox{red}{</xsl:text>
<xsl:copy-of select="$content"/>
<xsl:text>}</t></xsl:text>
</xsl:template>
导致以下乳胶输出:
\begin{lstlisting}[firstnumber=1,escapeinside={<t>}{</t>},moredelim={**[is][\bfseries]{<b>}{</b>}},moredelim={**[is][\itshape]{<i>}{</i>}},]
0240h: 00 20 <t>\colorbox{red}{00}</t> 21\end{lstlisting}
也许最好将另外一个moredelim添加到lstlisting而不是使用escapeinside,但是使用这个解决方案,我会回答这个问题。
答案 1 :(得分:1)
您正在使用dblatex,它是一个工具(一组XSLT样式表模块),它从DocBook生成PDF输出,其中间格式是LaTeX而不是XSL-FO。因此,为了自定义内联文本的外观(例如emphasis
),您必须使用LaTeX。以下模板适合您:
<xsl:template match="emphasis[@role='red']">
<xsl:param name="content">
<xsl:apply-templates/>
</xsl:param>
<xsl:text>{\color{red}</xsl:text>
<xsl:copy-of select="$content"/>
<xsl:text>}</xsl:text>
</xsl:template>
请注意,它显示emphasis
(没有d:
前缀)。 dblatex在转换开始时从DocBook 5源文档中删除命名空间,因此自定义中也不应该有命名空间。
emphasis
发生在screen
(这是一个“逐字”元素;请参阅http://dblatex.sourceforge.net/doc/manual/sec-verbatim.html)的事实使事情变得更加复杂。如果从您的示例screen
中删除了para
开始和结束标记,我的自定义建议会有效。
如果 bold
文本而不是红色是可接受的折衷方案,则可以在XML文档中使用以下内容:
<screen>0240h: 00 20 <emphasis role="bold">00</emphasis> 21</screen>
无需自定义即可实现此功能。 role="bold"
由默认的dblatex样式表处理。