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

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

DocBook文書をPDFファイルに変換するdblatexの色付きコード表示について(バージョン0.3現在)

概要

dblatexではDocBook文書のprogramlisting要素として記述するプログラムやマークアップ言語などを色付き表示(シンタックス・ハイライティング)することができる。programlistingタグのlanguage属性を言語ごとの名前にすることで、その言語ごとの文法に応じた色付き表示がされるようになる。日本語はそのままではうまく扱えないが、この問題の回避には成功したので、別記事で扱う。

対応言語と言語名

この言語名はListingsというパッケージが提供するもので、/usr/share/texmf-texlive/tex/latex/listings/lstlang1.styなど(2や3もある・ディストリによってディレクトリが異なる可能性もある)の中で

\lst@definelanguage{langname}

のような行で始まるまとまりで定義されている。言語によっては

\lst@definelanguage[Sharp]{C}%

のように、「C」の中の「Sharp」(「方言」的な扱い?)として複数の階層で名前が指定されるものもあり、DocBook文書側では

<programlisting language="{[sharp]c}"><![CDATA[
(ここにC#言語のコードを記述)
]]></programlisting>

といった形で波括弧を用いて言語名を指定する(波括弧を用いないとエラーとなる)。

対応言語名を一覧する

試しに、手元の環境(Mandriva Linux 2010.0)の.styファイル内の言語名一覧に近いものを出力してみると

$ cd /usr/share/texmf-texlive/tex/latex/listings/
[/usr/share/texmf-texlive/tex/latex/listings]$ grep definelanguage *.sty
lstdoc.sty:\lstdefinelanguage[doc]{Pascal}{%
lstlang1.sty:\lst@definelanguage{ACSL}[90]{Fortran}%
lstlang1.sty:\lst@definelanguage[2005]{Ada}[95]{Ada}%
lstlang1.sty:\lst@definelanguage[95]{Ada}[83]{Ada}%
lstlang1.sty:\lst@definelanguage[83]{Ada}%
lstlang1.sty:\lst@definelanguage[gnu]{Awk}[POSIX]{Awk}%
lstlang1.sty:\lst@definelanguage[POSIX]{Awk}%
lstlang1.sty:\lst@definelanguage[Visual]{Basic}
lstlang1.sty:\lst@definelanguage[ANSI]{C++}[ISO]{C++}{}%
lstlang1.sty:\lst@definelanguage[GNU]{C++}[ISO]{C++}%
lstlang1.sty:\lst@definelanguage[Visual]{C++}[ISO]{C++}%
lstlang1.sty:\lst@definelanguage[ISO]{C++}[ANSI]{C}%
lstlang1.sty:\lst@definelanguage[Objective]{C}[ANSI]{C}
lstlang1.sty:\lst@definelanguage[Handel]{C}[ANSI]{C}
lstlang1.sty:\lst@definelanguage[ANSI]{C}%
lstlang1.sty:\lst@definelanguage[Sharp]{C}%
lstlang1.sty:\lst@definelanguage{csh}
lstlang1.sty:\lst@definelanguage{bash}[]{sh}%
lstlang1.sty:\lst@definelanguage{sh}%
lstlang1.sty:\lst@definelanguage[90]{Fortran}[95]{Fortran}{}
lstlang1.sty:\lst@definelanguage[95]{Fortran}[77]{Fortran}%
lstlang1.sty:\lst@definelanguage[77]{Fortran}%
lstlang1.sty:\lst@definelanguage{HTML}%
lstlang1.sty:\lst@definelanguage[AspectJ]{Java}[]{Java}%
lstlang1.sty:\lst@definelanguage{Java}%
lstlang1.sty:\lst@definelanguage{JVMIS}%
lstlang1.sty:\lst@definelanguage{Matlab}%
lstlang1.sty:\lst@definelanguage[5.2]{Mathematica}[3.0]{Mathematica}%%
lstlang1.sty:\lst@definelanguage[3.0]{Mathematica}[1.0]{Mathematica}%
lstlang1.sty:\lst@definelanguage[1.0]{Mathematica}%
lstlang1.sty:\lst@definelanguage{Octave}%
lstlang1.sty:\lst@definelanguage[XSC]{Pascal}[Standard]{Pascal}
lstlang1.sty:\lst@definelanguage[Borland6]{Pascal}[Standard]{Pascal}
lstlang1.sty:\lst@definelanguage[Standard]{Pascal}%
lstlang1.sty:\lst@definelanguage{Perl}%
lstlang1.sty:\lst@definelanguage{POV}%
lstlang1.sty:\lst@definelanguage{Python}%
lstlang1.sty:\lst@definelanguage{Scilab}%
lstlang1.sty:\lst@definelanguage{SQL}%
lstlang1.sty:\lst@definelanguage{VHDL}%
lstlang1.sty:\lst@definelanguage[AMS]{VHDL}[]{VHDL}%
lstlang1.sty:\lst@definelanguage{XSLT}[]{XML}%
lstlang1.sty:\lst@definelanguage{Ant}[]{XML}%
lstlang1.sty:\lst@definelanguage{XML}%
lstlang2.sty:\lst@definelanguage[R/3 6.10]{ABAP}[R/3 4.6C]{ABAP}%
lstlang2.sty:\lst@definelanguage[R/3 4.6C]{ABAP}[R/3 3.1]{ABAP}%
lstlang2.sty:\lst@definelanguage[R/3 3.1]{ABAP}[R/2 5.0]{ABAP}{}%
lstlang2.sty:\lst@definelanguage[R/2 5.0]{ABAP}%
lstlang2.sty:\lst@definelanguage[R/2 4.3]{ABAP}[R/2 5.0]{ABAP}%
lstlang2.sty:\lst@definelanguage[CORBA]{IDL}%
lstlang2.sty:\lst@definelanguage[Objective]{Caml}[light]{Caml}
lstlang2.sty:\lst@definelanguage[light]{Caml}
lstlang2.sty:\lst@definelanguage[ibm]{Cobol}[1985]{Cobol}%
lstlang2.sty:\lst@definelanguage[1985]{Cobol}[1974]{Cobol}%
lstlang2.sty:\lst@definelanguage[1974]{Cobol}%
lstlang2.sty:\lst@definelanguage{Delphi}%
lstlang2.sty:\lst@definelanguage{Eiffel}%
lstlang2.sty:\lst@definelanguage{Euphoria}%
lstlang2.sty:\lst@definelanguage{GCL}%
lstlang2.sty:\lst@definelanguage{Gnuplot}%
lstlang2.sty:\lst@definelanguage{Haskell}%
lstlang2.sty:\lst@definelanguage{IDL}%
lstlang2.sty:\lst@definelanguage{inform}{%
lstlang2.sty:\lst@definelanguage{Lisp}%
lstlang2.sty:\lst@definelanguage[Auto]{Lisp}%
lstlang2.sty:\lst@definelanguage[gnu]{make}%
lstlang2.sty:\lst@definelanguage{make}
lstlang2.sty:\lst@definelanguage{Mercury}%
lstlang2.sty:\lst@definelanguage{Miranda}%
lstlang2.sty:\lst@definelanguage{ML}%
lstlang2.sty:\lst@definelanguage{Oz}%
lstlang2.sty:\lst@definelanguage{PHP}%
lstlang2.sty:\lst@definelanguage{Prolog}%
lstlang2.sty:\lst@definelanguage{Rexx}
lstlang2.sty:\lst@definelanguage{Ruby}%
lstlang2.sty:\lst@definelanguage{SHELXL}%
lstlang2.sty:\lst@definelanguage[tk]{tcl}[]{tcl}%
lstlang2.sty:\lst@definelanguage[]{tcl}%
lstlang2.sty:\lst@definelanguage{VBScript}%
lstlang2.sty:\lst@definelanguage[97]{VRML}
lstlang3.sty:\lst@definelanguage[68]{Algol}%
lstlang3.sty:\lst@definelanguage[60]{Algol}%
lstlang3.sty:\lst@definelanguage[Motorola68k]{Assembler}%
lstlang3.sty:\lst@definelanguage[x86masm]{Assembler}%
lstlang3.sty:\lst@definelanguage{Clean}%
lstlang3.sty:\lstdefinelanguage{CIL}%
lstlang3.sty:\lst@definelanguage{Comal 80}%
lstlang3.sty:\lst@definelanguage[WinXP]{command.com}%
lstlang3.sty:\lst@definelanguage{Comsol}%
lstlang3.sty:\lst@definelanguage{Elan}%
lstlang3.sty:\lst@definelanguage{erlang}%
lstlang3.sty:\lst@definelanguage{ksh}
lstlang3.sty:\lst@definelanguage{Lingo}
lstlang3.sty:\lst@definelanguage{Logo}%
lstlang3.sty:\lst@definelanguage{MetaPost}%
lstlang3.sty:\lst@definelanguage{Mizar}%
lstlang3.sty:\lst@definelanguage{Modula-2}%
lstlang3.sty:\lst@definelanguage{MuPAD}{%
lstlang3.sty:\lst@definelanguage{NASTRAN}
lstlang3.sty:\lst@definelanguage{Oberon-2}%
lstlang3.sty:\lst@definelanguage[decorative]{OCL}[OMG]{OCL}
lstlang3.sty:\lst@definelanguage[OMG]{OCL}%
lstlang3.sty:\lst@definelanguage{Plasm}%
lstlang3.sty:\lst@definelanguage{PL/I}%
lstlang3.sty:\lst@definelanguage{PostScript}{%
lstlang3.sty:\lst@definelanguage{Promela}
lstlang3.sty:\lst@definelanguage{PSTricks}%
lstlang3.sty:\lst@definelanguage{Reduce}%
lstlang3.sty:\lst@definelanguage{RSL}%
lstlang3.sty:\lst@definelanguage[IBM]{Simula}[DEC]{Simula}{}%
lstlang3.sty:\lst@definelanguage[DEC]{Simula}[67]{Simula}%
lstlang3.sty:\lst@definelanguage[CII]{Simula}[67]{Simula}%
lstlang3.sty:\lst@definelanguage[67]{Simula}%
lstlang3.sty:\lst@definelanguage{SPARQL}%
lstlang3.sty:\lst@definelanguage{S}[]{R}{}
lstlang3.sty:\lst@definelanguage[PLUS]{S}[]{R}{}
lstlang3.sty:\lst@definelanguage{R}%
lstlang3.sty:\lst@definelanguage{SAS}%
lstlang3.sty:\lst@definelanguage[AlLaTeX]{TeX}[LaTeX]{TeX}%
lstlang3.sty:\lst@definelanguage[LaTeX]{TeX}[common]{TeX}%
lstlang3.sty:\lst@definelanguage[plain]{TeX}[common]{TeX}%
lstlang3.sty:\lst@definelanguage[common]{TeX}[primitive]{TeX}
lstlang3.sty:\lst@definelanguage[primitive]{TeX}%
lstlang3.sty:\lst@definelanguage{Verilog}%
lstmisc.sty:\lst@UserCommand\lstdefinelanguage{\lst@DefLang\iftrue}
lstmisc.sty:\lst@UserCommand\lst@definelanguage{\lst@DefLang\iffalse}
lstmisc.sty:\lstdefinelanguage{}{}

のようになった。

行番号表示に関する指定

同タグのlinenumbering属性を「numbered」にすることで行番号を左に表示するようにできる。

<programlisting language="[言語名]" linenumbering="numbered"><![CDATA[
(ここにコードを記述)
]]></programlisting>

更に、行番号の開始値をstartinglinenumber属性で指定することもできる。

<programlisting language="[言語名]" linenumbering="numbered" startinglinenumber="[開始行]"><![CDATA[
(ここにコードを記述)
]]></programlisting>


画像は両方とも「linenumbering="numbered"」付き(ない場合は行番号は付かない)・上がstartinglinenumber指定なし、下が「3」を指定したもの

関連記事:

関連URL:

使用したバージョン:

  • dblatex 0.3
  • TeX Live 2007-21.r6295.7mdv2010.0
  • Python 2.6.4