W32TeX や TeX Live では既に更新されている。
- Package BXjscls(CTAN)1.7 版。
今回の記事では Pandoc モード関連の改修について解説する。
Pandoc モードでの paragraph マーク
BXJS が paragraph でマークする件
BXJS クラスでは、jsclasses の仕様を引き継いで、paragraph レベル(\paragraph
)の見出しにマーク(既定では“■”)が付加される。
\subsection{本質的な情報の見せ方} \paragraph{マフラーの色について} 技術書を読んでいて内容が理解しづらいという場合、 その原因の多くは「本質的な情報がどこにあるのかが判りにくい」 %……(略)……
しかし、この「paragraph 特有の取扱」は、「パラグラフレベル*1がそれより上位の区分(章レベル・節レベル)とは異なる意味づけをもち、それゆえに異なる形式をもつ」ことを前提にしていると考えられる。
Pandoc が paragraph でマークするとアレ
一方で、Pandoc における文書区分のモデルは Markdown や HTML のものを引き継いでいて、そこでは単純に 6 レベル(HTML の H1〜H6)の区分が存在し、少なくとも先験的には意味合いの差異はないと考えられる。*2従って、デフォルトの LaTeX テンプレートにおいては、全ての文書区分が均質になることを企図して、「パラグラフレベル(paragraph・subparagraph)も別行見出しをもつ」ように文書クラスの設定を改変する細工を施している。
例えば、次のような Markdown 文書があったとする。
# 素敵な技術書のつくりかた ## 素敵とは本質的であること ### 本質的な情報の見せ方 #### マフラーの色について 技術書を読んでいて内容が理解しづらいという場合、 ……(略)……
これを bxjsarticle クラスの Pandoc モードを指定して LaTeX 文書に変換すると、出力結果は次のようになる。
見ての通り、ここで paragraph レベルだけマークが付いているのは奇妙である。
Pandoc モードでは paragraph でマークしない件
この問題に対処するため、Pandoc モードでの paragraph のマーク付加の仕様を以下のように定めた。
- Pandoc の設定の影響で paragraph の形式が BXJS の既定と異なる形式になる場合は、paragraph マークの既定値(“■”)を空に変更する。
従って、Pandoc の既定の設定では paragraph マークは付かなくなる。
Pandoc モードでも paragraph でマークする場合
ただし、既定値が変わるだけなので、Pandoc モードであっても、paragraph-mark
クラスオプションを指定することで好きなマークを付加することは相変わらず可能である。
--- title: Pandocでつくる 素敵技術書作成入門 author: 南斗火 太郎 papersize: a5 documentclass: bxjsarticle classoption: - pandoc - paragraph-mark=☃ --- ……(略)…… #### マフラーの色について 技術書を読んでいて内容が理解しづらいという場合、 ……(略)……
また、Pandoc 側で「パラグラフレベルの形式変更の細工を抑止するためにテンプレート変数 subparagraph
が真に設定されている」場合は、既定の paragraph マークが保持される。((ただし、Pandoc 側の --number-sections
(-N
)オプションおよび secnumdepth
変数の指定により、paragraph レベルがの見出しが番号付きになっている場合は、再び既定の paragraph マークが抑止される。))
Pandoc モードでの三点リーダ
Pandoc で和文三点リーダできない話
Pandoc において LaTeX 形式で出力する場合、入力テキスト中に含まれる Unicode 文字の幾つかを「LaTeX 式の入力」に変換する。その中に、和文文書において問題となるものが存在する。
…
(U+2026) →\ldots{}
‘
(U+2018) →`
’
(U+2019) →'
“
(U+201C) →``
”
(U+201D) →''
これらの変換は欧文の文書においては問題がない。((エンジンが XeTeX/LuaTeX の場合、defaultfontfeatures
で Ligatures=TeX
を有効にしている。))ところが、日本語 LaTeX においては一般に(xeCJK や LuaTeX-ja も含めて)、「Unicode 文字(左側)は和文扱い、“LaTeX 式の入力”(右側)は欧文扱い」という取扱がされている。従って、このままでは上記の 5 種の約物が常に欧文扱いになってしまい不都合である。
TeXはアレ……、いや違う、TeXは“超絶アレ”だ。
この中で、後ろの 4 つ(変換先がリガチャのもの)については、変換を抑止する方法がある。
- Pandoc 2.0 版の場合: 出力の latex から smart 拡張を外す、つまり
-t latex-smart
とする。 - Pandoc 1.x 版*3の場合:
--no-tex-ligatures
オプションを指定する。
これに対して、「…
→\ldots{}
」の変換を抑止する方法は提供されていないらしい。*4BXJS クラスは当然和文の文書を想定しているため、“…”は和文として出力できないと困る。
Pandoc モードで和文三点リーダできる話
この問題に対処するため、Pandoc モードでは以下の処置を行うことにした。
\ldots
を再定義し、非数式モードでかつ“\ldots{}
”という形になっている場合は代わりに“…
”を実行する。すなわち、和文の“…”が出力される。
従って、Pandoc モードを利用して、かつリガチャ関連の変換を抑止する指定(“-t latex-smart
”または“--no-tex-ligatures
”)を併用すると、和文の約物を正常に出力できるようになる。
pdfLaTeX + Pandoc モードでは autotilde しない
通常、BXJS クラスを pdfLaTeX で使用する場合は、bxcjkjatype パッケージの autotilde
オプションが有効になっていて、「~
」で和欧文間空白(四分空き)を挿入できるようになっている。
% pdfLaTeX文書の本体 結局~Markdown~も\textbf{激アレ}であった。
しかし、Markdown などの他形式から Pandoc で変換する場合、「~
」を入力してもそのまま「LaTeX で定義された ~
」になるわけではない。((Markdown で「~
」を書くとそのまま“~”の文字を入力したことになる。))だから結局四分空きを手動で入れることはできない。
(Markdownの入力) 結局Markdownも**激アレ**であった。
それに、Pandoc が LaTeX への変換結果として「~
」を出したとするなら、当然それは「autotilde した場合の ~
(和欧文間空白)」ではなくて「LaTeX 標準の ~
(非分割欧文空白)」を想定していると考えるべきであろう。従って、Pandoc の変換を前提にする場合には autotilde を有効にすることは害にしかならないので、以下の修正を行った。
- Pandoc モードでは、pdfLaTeX エンジン使用時に内部で読み込まれる bxcjkjatype パッケージに対して
autotilde
を指定しない。
もちろん、自動的に四分空きが入るようになったわけではない。なので、pdfLaTeX で Pandoc モードを使う場合は四分空きは諦めるしかないであろう。