マクロツイーター

はてダから移行した記事の表示が崩れてますが、そのうちに直せればいいのに(えっ)

BXjscls の新しいやつ(v1.7)

W32TeXTeX Live では既に更新されている。

今回の記事では 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 の場合、defaultfontfeaturesLigatures=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{}”という形になっている場合は代わりに“”を実行する。すなわち、和文の“…”が出力される。
    • 数式モードの \ldots は標準通りである。従って、(tex_math_dollars 拡張有効時に)TeX 形式数式で \ldots を書いた場合は、欧文の“…”が出力される。
    • 非数式モードでも後続が {} でない \ldots は標準通りである。従って、raw_tex 拡張有効時に \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 モードを使う場合は四分空きは諦めるしかないであろう。

*1:「パラグラフレベル」は paragraph と subparagraph、「節レベル」は section と subsection と subsubsection、「章レベル」は chapter。

*2:もちろん、後付で意味を与えることは可能であり、Pandoc においては、それは適切な CSSLaTeX 文書クラスと紐付けられた特定のテンプレートを適用することで実現される。

*3:ただし 2015 年以降の版に限る。

*4:もしかしたら、Pandoc 2.0 版にはあるかも知れないが……。