2

我需要输出一些十六进制数据,其中一些字节用彩色背景突出显示。数据中表示红色值的字节应具有红色背景。这就是我选择的原因

<emphasis role="red"></emphasis>

成为首选标签。

HTML 输出

对于我使用的 HTML 输出

  <xsl:param name="emphasis.propagates.style" select="1"/>

在 xsl 文件中和

.red {
  background-color: red;
}

在样式表中。这完美无缺。

PDF输出

对于 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>

和(文件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}

我究竟做错了什么?

4

2 回答 2

2

正如 mzjn 所说,屏幕标签是个问题。阅读链接资源后,在这种情况下适用于我并产生类似于 html 外观的输出的最终模板是:

<xsl:template match="emphasis[@role='red']" mode="latex.programlisting">
  <xsl:param name="co-tagin" select="'&lt;:'"/>
  <xsl:param name="rnode" select="/"/>
  <xsl:param name="probe" select="0"/>
  <xsl:param name="content">
    <xsl:apply-templates/>
  </xsl:param>
  <xsl:text>&lt;t&gt;\colorbox{red}{</xsl:text>
  <xsl:copy-of select="$content"/>
  <xsl:text>}&lt;/t&gt;</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}

也许在 lstlisting 中添加另一个 moredelim 比使用 escapeinside 更好,但是有了这个解决方案,这个问题就为我解答了。

于 2013-12-28T18:39:42.440 回答
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 样式表处理。

于 2013-12-27T13:58:49.260 回答