試験運用中なLinux備忘録・旧記事

はてなダイアリーで公開していた2007年5月-2015年3月の記事を保存しています。

DocBook XML文書をPDF形式に変換するdblatexに挑む(screen要素やprogramlisting要素などを使用すると起きる問題)

  1. サンプルについて
  2. screen要素やprogramlisting要素を使用するとエラー?
  3. screenやprogramlistingに日本語を含めると...

サンプルについて

使用するサンプルは前回と同じで、「DocBook文書について」の「bookの例」として貼り付けた文書をbooktest.xmlとして使用する。今回は、この文書の2番目のchapterを

 <chapter id="chap2">
  <title>2番目の章</title>
  <para>2番目の章の段落</para>
  <screen><prompt>$</prompt> ls</screen>
 </chapter>

として、端末にプロンプト「$」と、コマンド「ls」を入力している状態を示す記述を追加してみる。

screen要素やprogramlisting要素を使用するとエラー?

これを処理すると

Build the listings...
XSLT stylesheets DocBook -  LaTeX 2e (0.2.7)
===================================================
Build booktest.pdf
This is pdfeTeX, Version 3.141592-1.30.5-2.2 (Web2C 7.5.5)
entering extended mode
pdflatex failed
/usr/share/texmf/tex/latex/latex-unicode/utf8x.def:27: Package utf8x Error: Please use \usepackage{ucs} to support encoding utf8x.
/usr/share/texmf/tex/latex/latex-unicode/utf8x.def:27: leading text: ...epackage{ucs} to support encoding utf8x}{}
Error: pdflatex compilation failed

となる。
LaTeX文書側のエラーが出たので、-t texを付け、中間ファイルのLaTeX文書を出力してみる。入力されたXMLファイルをdblatexに付属するXSLスタイルシートに通したものがこの.texファイルになる。

$ dblatex -t tex booktest.xml
Build the listings...
XSLT stylesheets DocBook -  LaTeX 2e (0.2.7)
===================================================
'booktest.tex' successfully built

これを開くと

% -----------------------------------------  
% Autogenerated LaTeX file from XML DocBook  
% -----------------------------------------  
%%<params>
%% latex.encoding utf8
%%</params>
\documentclass{report}
\usepackage{fancybox}
\usepackage{makeidx}
\def\hyperparamadd{pdfcreator=DBLaTeX-0.2.7}
\usepackage[hyperlink]{docbook}
\lstset{inputencoding=utf8x, extendedchars=\true}
\setuplocale{ja}
\renewcommand{\DBKreleaseinfo}{}
\setcounter{tocdepth}{5}
\setcounter{secnumdepth}{5}
\renewcommand{\DBKcopyright}{\noindent 製作著作 \textnormal{\copyright} 2007 Copyright (C) Taro Yamada}
\title{タイトル}
\author{山田 太郎 [FAMILY Given]}
(以下略)

のようになっている。これをPDFへ変換処理するには、

$ TEXINPUTS=[インストール先]/share/dblatex//: pdflatex booktest.tex

のようにする。TEXINPUTSをセットしないと、dblatexに含まれるstyファイルが見付けられず

! LaTeX Error: File `docbook.sty' not found.

となる。
指示*1どおり、下のように該当記述を追加して

--- booktest.tex.orig
+++ booktest.tex
@@ -7,6 +7,7 @@
 \documentclass{report}
 \usepackage{fancybox}
 \usepackage{makeidx}
+\usepackage{ucs}
 \def\hyperparamadd{pdfcreator=DBLaTeX-0.2.7}
 \usepackage[hyperlink]{docbook}
 \lstset{inputencoding=utf8x, extendedchars=\true}

下を実行すると、

$ TEXINPUTS=[インストール先]/share/dblatex//: pdflatex booktest.tex

無事にPDFファイルが生成された。そこで、XSLスタイルシート側を

--- [インストール先]/share/dblatex/xsl/lang.xsl.orig
+++ [インストール先]/share/dblatex/xsl/lang.xsl
@@ -205,6 +205,7 @@
   </xsl:variable>
   <xsl:choose>
   <xsl:when test="$use-unicode='1' or $latex.encoding='utf8'">
+    <xsl:text>\usepackage{ucs}&#10;</xsl:text>
     <xsl:text>\lstset{inputencoding=utf8x, extendedchars=\true}&#10;</xsl:text>
   </xsl:when>
   <xsl:when test="$latex.encoding='latin1' and $latex.unicode.use!='0'">

といった感じに修正すると、今後、上の流れを手動で行う必要はなくなる。なお、
[引用]ファイル名: [インストール先]/share/dblatex/xsl/lang.xsl より

  <xsl:when test="$latex.encoding='utf8'">
    <xsl:text>\usepackage[T2A,T2D,T1]{fontenc}&#10;</xsl:text>
    <xsl:text>\usepackage{ucs}&#10;</xsl:text>
    <xsl:text>\usepackage[utf8x]{inputenc}&#10;</xsl:text>
  </xsl:when>

この3行はLaTeX文書には追加されないのだが(-Pを付けて指定しても変化なし)、.texファイルに上記3行の「\usepackage」を直接書いた場合

(中略)
Package hyperref Warning: Set package option `unicode' first
(hyperref)                in order to load unicode support.

(/usr/share/texmf/tex/latex/cjk-latex/CJKutf8.sty

! LaTeX Error: Option clash for package inputenc.

See the LaTeX manual or LaTeX Companion for explanation.
Type  H <return>  for immediate help.
 ...

l.33 \RequirePackage
                    [encapsulated]{CJK}

のようなエラーが出てしまう。「\usepackage[encapsulated]{CJK}」を「{ucs}」の上の行に追加しても同じだった。

screenやprogramlistingに日本語を含めると...

今度は、日本語を含めて

 <chapter id="chap2">
  <title>2番目の章</title>
  <para>2番目の章の段落</para>
  <screen><prompt>$</prompt> touch テスト.txt</screen>
 </chapter>

としてみる。

Build the listings...
XSLT stylesheets DocBook -  LaTeX 2e (0.2.7)
===================================================
Build booktest.pdf
This is pdfeTeX, Version 3.141592-1.30.5-2.2 (Web2C 7.5.5)
entering extended mode
pdflatex failed
booktest_tmp.tex:97: Package ucs Error: Unknown Unicode character 12486 = U+30C6,
booktest_tmp.tex:97: leading text: $ touch テ
booktest_tmp.tex:97: Package ucs Error: Unknown Unicode character 12473 = U+30B9,
booktest_tmp.tex:97: leading text: $ touch テス
booktest_tmp.tex:97: Package ucs Error: Unknown Unicode character 12488 = U+30C8,
booktest_tmp.tex:97: leading text: $ touch テスト
Error: pdflatex compilation failed

.texファイルを出力後、これを手動で処理し、詳細なメッセージを見たところ

! Package ucs Error: Unknown Unicode character 12486 = U+30C6,
(ucs)                possibly declared in uni-48.def.
(ucs)                Type H to see if it is available with options.

See the ucs package documentation for explanation.
Type  H <return>  for immediate help.
 ...

l.97 $ touch テ
                スト.txt\end{lstlisting}
? H
Unicode character 12486 = U+30C6:
KATAKANA LETTER TE
Character available with following options:
   cjkjis.

となった。
中間ファイルを手動で編集し、「\usepackage[cjkjis]{ucs}」に修正すると

! Undefined control sequence.
\u-cjkjis-12486 #1->\jischar
                             {2546}
l.94 $ touch テ
                スト.txt\end{lstlisting}

このようなエラーになる。

.texファイル中の該当部分は

\begin{lstlisting}[firstnumber=1,]
$ ls テスト.txt\end{lstlisting}

なのだが、ここには日本語が入れられない仕様だとかいうことはあるのだろうか...?

LaTeXのことがよく分からないこともあり、何か大きな勘違いをしているのかもしれないが、お手上げ状態なので、この実験はこのあたりにしておく。

*1:Please use \usepackage{ucs} to support encoding utf8x.