マクロツイーター

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

LaTeX 文書の出力用紙サイズを指定する(だけ) ― bxpapersize パッケージ

この記事では拙作の「bxpapersize パッケージ」について解説する。

TeX Live および W32TeX に収録されている。

コレ is 何

bxpapersize は「出力の用紙サイズを指定する」ための“専用”のパッケージである。

この説明でピンとこない人は、次の記事を参照してほしい。

要するに、レイアウト用と出力用の用紙サイズは一致するのが“普通”なはずなのに、LaTeX ではそうなっておらず、また“普通”にするための「汎用的に使える方法」が次のような“わけのわからない”ものしか存在しない、ということが問題なのである。

% geometryするけどgeometryしないよ!
\usepackage[pass]{geometry}

恐らく普通の LaTeX ユーザによって解りやすいのは「用紙サイズを設定するための専用のパッケージ」が用意されていることであろう。実際に、そういう“専用”のパッケージは幾つか公開されているようであるが、(bxpapersize を最初に公開した 2016 年 3 月の時点では※)CTAN や TeX Live に収録されているものは無かったので、結局それは“汎用的に使える”方法とはいえないものであった。これが bxpapersize を作製した動機である。

※現在では、iNOUE Koich! 氏原作の bounddvi パッケージが platex-tools バンドルに取り込まれて CTAN および TeX Live に収録されている。ただし bounddvi は(名前の通り)DVI 出力のみをサポートすることに注意。

あのサイズとこのサイズを一致させる話

まずは“普通”の場合、つまり「出力の用紙サイズをレイアウトの用紙サイズに一致させたい」場合を考える。要するに、\documentclass のオプションに a5paper と指定した(これが「レイアウトの用紙サイズ」)ときに「出力の用紙サイズ」を A5 判にしたい、というような話である。この場合は、単純に bxpapersize パッケージを読み込めば実現できる。

% レイアウトはA5判
\documentclass[a5paper]{article}
\usepackage{bxpapersize}% 読み込むだけでOK
\begin{document}
Hello\vfill {\TeX}!
\end{document}

この文書を LaTeX(エンジンは何でもよい)で DVI または PDF 文書に変換すると、出力の文書の用紙サイズが A5 判(148mm×210mm)に設定される。*1

版面の拡大縮小のために「mag 設定」が行われている場合にも対応している。

% (pdf)LaTeX文書
% レイアウトはA4判を基準にする
\documentclass[a4paper]{article}
\usepackage{bxpapersize}% 読み込むだけでOK
%!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!! TeX code BEGIN
% そして版面を2倍に拡大をする
\mag=2000
%!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!! TeX code END
\begin{document}
% (以下略)

この場合、出力の用紙サイズは“A4 判の 2 倍”(420mm×594mm)となる。

jsclasses バンドルの文書クラス(jsarticle など)は「内部で mag 設定を利用している」が、この場合も大丈夫である。

% upLaTeX文書
% レイアウトは(実際に)A4判
\documentclass[uplatex,a4paper,12pt]{jsarticle}
\usepackage{bxpapersize}
\begin{document}
こんにちはこんにちは\vfill {\TeX}\end{document}

この場合、出力の用紙サイズは A4 判(210mm×297mm)となる。*2もちろん、jsclasses のクラスの場合は papersize オプションが使えるので、bxpapersize をわざわざ用いる必要性はないだろう。

あのサイズをこのサイズではない何かにする話

文書クラスやパッケージによっては、「出力の用紙サイズ」を表す \stockwidth\stockheight というパラメタを定義して*3設定するものがある。そういう場合は、bxpapersize は「レイアウト用の用紙サイズ」(\paperwidth\paperheight)ではなく「出力の用紙サイズ」(\stockwidth\stockheight)を採用する。身近な例では、jsclasses のクラスで tombow 等のオプションを指定してトンボ出力を有効にした場合が該当する。

% upLaTeX文書
% レイアウトはA5判
\documentclass[uplatex,a5paper,9pt,tombow]{jsarticle}
\usepackage{bxpapersize}
\begin{document}
こんにちはこんにちは\vfill {\TeX}\end{document}

この場合、トンボ出力のために各辺に 1in の余白が取られるので、本来の A5 判(148mm×210mm)に対して縦横に 2in(= 50.8mm)だけ増えたサイズ(198.8mm×260.8mm)が \stockwidth/height に設定されるため、出力用紙サイズはそれに一致することになる。

また、(u)pLaTeX の標準文書クラス(jarticle 等)でトンボ出力の有効にした場合は、\stockwidth/height パラメタは設定(定義)されないが、bxpapersize ではこのケースも特別に取り扱って、所望の出力用紙サイズを設定するようにしている。

% pLaTeX文書
% レイアウトはA5判
\documentclass[a5paper,tombow]{jsarticle}
\usepackage{bxpapersize}
\begin{document}
こんにちはこんにちは\vfill {\TeX}\end{document}

先の jsarticle の例と同じく、これの出力サイズは“A5 判の 2in 増し”(198.8mm×260.8mm)となる。

なお、bxpapersize の読込時にオプションとして「size=real*」を付けると、「\stockwidth/height パラメタが設定されている状況」や「トンボ出力が有効だと見なされる状況」においても常に「レイアウトの用紙サイズ」(\paperwidth/height)の方を採用して、そちらに出力用紙サイズを合わせるようになる。

あのサイズをコレコレにする話

bxpapersize の size パラメタの値として直接に用紙サイズを指定することで、出力の用紙サイズをレイアウトのものとは無関係な任意の値に設定することができる。

% レイアウトはB5判
\documentclass[b5paper,dvipdfmx]{article}
% だけど出力はA4判
\usepackage[size=a4paper]{bxpapersize}
\begin{document}
Hello\vfill {\TeX}!
\end{document}

ただし、bxpapersize は飽くまで「出力用紙サイズを設定する」だけであり、他の機能、例えば「実際の版面を用紙の中央に配置する」とか「トンボを出力する」については一切関与しない。だから上掲の例の場合、単に A4 の用紙の左上隅の B5 判の大きさの領域に版面があるという、あまり意味のない出力になる。

size の値として指定する用紙サイズの名前(b4j 等)は、geometry パッケージに従っている。((A 判は a0papera6paper、ISO B 判は b0paperb6paper、JIS B 判は b0jb6j と指定する。))横置きを指定するには、landscape オプションを追加する。(この他、geometry と同じ意味の truedimen オプションも存在する。)

% 出力サイズを"A5横"に指定する
\usepackage[size=a5paper,landscape]{bxpapersize}

size パラメタはパッケージ(\usepackage)のオプションと指定する他に、\papersizesetup という命令を用いて指定することもできる。

% 直前の例と同等
\usepackage{bxpapersize}
\papersizesetup{size=a5paper,landscape}

\papersizesetup を使う場合は、縦横の長さを任意に指定することもできる。((パッケージオプションには「{ } を含む文字列は使えない」という制約があるため、この指定をパッケージオプションで行うことはできない。))

\usepackage{bxpapersize}
\papersizesetup{size={100mm,148mm}}
一体何がしたいのか

このような指定が有用である場面を紹介する。次のような出力データを構成する文書クラス hogearticle があったとする。

  • レイアウトは A4 判を基準にして行う。つまり、\paperwidth/height は A4 判相当の値になっている。
  • JIS B4 判の紙面の中央にその A4 判の版面を配置し、周りの余白にトンボを出力する。

このクラスを使った文書を dvipdfmx を使って PDF に変換する*4場合、当然、出力サイズは JIS B4 判でなければならない。昔はこういう場合に「dvipdfmx のオプションで用紙サイズを指定する」ワークフローが想定されていた。

dvipdfmx -p jisb4 myarticle.dvi

しかし今は「出力用紙サイズを設定する」作用をもつパッケージが増えている。特に最近は graphicx パッケージがそれに該当することに注意が必要である。そういうパッケージはここで想定するワークフローとは相性が悪い。

% \paperwidth/height はA4判, しかし想定の出力サイズはJIS B4判
\documentclass[dvipdfmx]{hogearticle}
\usepackage{graphicx}% 画像したいね

この場合、graphicx パッケージは出力 DVI の出力用紙サイズを「レイアウトの用紙サイズと同じ」、すなわち A4 判に設定する。DVI で出力用紙サイズの指定を既に持っている場合、その指定は dvipdfmx のオプションでの指定よりも優先されるため、先のコマンドラインのように「-p jisb4」を指定していても、出力の PDF の用紙サイズは A4 判となってしまう。つまり件のワークフローは破綻してしまうのである。

今の場合、graphicx に「出力用紙サイズの指定を抑止する」ためのオプション nosetpagesize を指定すれば問題を回避できる。

\documentclass[dvipdfmx]{hogearticle}
\usepackage[nosetpagesize]{graphicx}% 用紙サイズ設定イラネ

ただ、「どのパッケージが出力用紙サイズを指定するのか」「どうすれば指定を抑止できるのか」というのは普通の LaTeX ユーザには解りにくい話であるし、そもそも「最近は DVI で出力用紙サイズを指定するのが一般的になっている」のなら、より合理的な選択は「DVI で出力用紙サイズを JIS B4 に指定する」ことになるだろう。bxpapersize パッケージを使うとこれが実現できるわけである。

\documentclass[dvipdfmx]{hogearticle}
\usepackage[size=b4j]{bxpapersize}% 出力サイズはJIS B4判
\usepackage{graphicx}

なお、上の例では graphicx に nosetpagesize を付けていないので、「出力用紙サイズ指定の競合」が起こることになるので、後に述べる priority オプションを併用するといいかも知れない。

強い態度に出る話

先に述べたように、「出力の用紙サイズを指定する」作用をもつ文書クラスパッケージは幾つか存在する。従って、それらと bxpapersize を併用すると、出力用紙サイズの指定が“競合”することになる。単純な場合(レイアウトの用紙サイズに合わせればよいだけの場合、等)は“競合”が起こっても結局全て同じサイズを指定しているだけなので実際に問題は起こらない。しかし、少し複雑な場合、例えば「mag 設定がある」「\stockwidth/height が指定されている」「bxpapersize で出力サイズを直接指定した(size=a4paper)」という場合は、相矛盾する設定が各パッケージにより行われることになる。この場合にどれが“勝つ”(実際に適用される)か、というのは(少なくとも普通の LaTeX ユーザにとっては)非常に予測し難いものである。

この問題に対処するため、bxpapersize では「自分の設定を優先させる」ためのオプション「priority=high」を用意している。もし、bxpapersize で指定した出力用紙サイズが効いていないように見える場合は、このオプションを追加すると問題が解消するかも知れない。(なお、priority パラメタはパッケージオプションでのみ指定可能で、\papersizesetup では使えない。)

\documentclass[dvipdfmx]{hogearticle}
\usepackage[size=b4j,priority=high]{bxpapersize}% オレの設定を聞け!!
\usepackage{graphicx}

※priority パラメタは dvipdfmx および「TeX Live 2017 以降の dvips」でのみ使用できる。PDF 出力の場合は無効である。((どうしても(2017 より)古い dvips で使いたい、という場合は olddvips というパッケージオプションを付けると上手くいくかも知れない。TeX Live 2017 で dvips の仕様が変わったため、このようなヤヤコシイことになっている。))

*1:「DVI の用紙サイズが A5 判」ということは、その DVI を dviout や xdvi で閲覧した場合は A5 判として表示されるし、また dvips で PostScript 文書に変換、および dvipdfmx で PDF 文書に変換した場合も出力の文書は A5 判に設定される。

*2:mag 設定は"内部で利用している"だけで、拡大縮小したいわけではない。

*3:つまり、標準の LaTeX にはそういうパラメタはない。

*4:dvips で PostScript に変換する場合も話は全く同じである。