TeX Alchemist Online

TeX を使って化学のお仕事をしています。

previewパッケージと \mag

前記事に引き続き,\mag の話です。

追記(2016/09/06):本記事で述べた「開発版 jsclasses」は,正式版としてリリースされ TeX Live 2016 のレポジトリに収録されました。

前記事で述べたように,開発版 jsclasses に搭載されている nomag または nomag* オプションによって \mag を使用しない版面設計を行えば,\mag に対応しないパッケージを正しく使用することができるようになります。

一方,パッケージの中身に手を入れる,開発元に意見するなどして,パッケージを \mag に対応させる,という方向性の解決策もあり得ます。最近では,graphicx パッケージの改修によって \mag 使用時にページサイズ設定がおかしくなる事案が発生しました。graphicx パッケージのバージョンアップに伴うdvips.defdvipdfmx.def の修正によって,デフォルトで用紙サイズ設定の special が発行されるようになったのですが,それが \mag の使用を想定していないがために,jsclasses で 10pt 以外を使用すると用紙サイズ設定がおかしくなるという問題でした。この問題は,現在の最新版 graphicx パッケージでは修正されています。

(u)pLaTeX + preview パッケージ + dvipdfmx での \mag 使用

以前の記事で,図版サイズギリギリにPDFページサイズを切り詰める preview パッケージを紹介しました。

doratex.hatenablog.jp

この記事で紹介したように,preview パッケージはそのままでは dvipdfmx に対応していないものの,ZRさん作のドライバファイル prdvipdfmx.def を手に入れれば, (u)pLaTeX + dvipdfmx のワークフローで preview パッケージが使えるようになります。

ただし,preview パッケージ自体は \mag に対応しているものの,この prdvipdfmx.def は \mag に対応していないようです。そこで,\mag を使用している際にも正しく機能するよう修正を試みました。

修正版 prdvipdfmx.def

%
% prdvipdfmx.def
%
%% Avoids duplicate loading.
\csname bxpw@prdvipdfmx@loaded\endcsname
\def\bxpw@prdvipdfmx@loaded{\endinput}
%% If the engine is XeTeX or pdfTeX/LuaTeX then quits.
\@tempswatrue
\ifx\XeTeXversion\@undefined\else \@tempswafalse \fi
\ifx\pdfoutput\@undefined\else
  \ifnum\pdfoutput>\z@  \@tempswafalse \fi
\fi
\if@tempswa\else \expandafter\endinput\fi\relax
%% If prtightpage.def is already loaded, it's too late.
\ifx\pr@bbadjust\@undefined\else
  \PackageError{preview}%
   {'dvipdfmx' must be specified earlier}\@ehc
\expandafter\endinput\fi\relax
%% Sets \pr@graphicstype.
\let\pr@graphicstype\m@ne
%% Interrupts the process of 'tightpage' option.
\let\bxpw@default@ds\default@ds
\def\default@ds{%
  \ifnum\pr@graphicstype=\m@ne
    \def\bxpw@tightpage{tightpage}%
  \fi
  \ifx\CurrentOption\bxpw@tightpage
    \bxpw@dispatch
  \else \bxpw@default@ds
  \fi}
%% \bxpw@dispatch
% Dispatched when 'tightpage' option is found.
\def\bxpw@dispatch{%
%
  \typeout{Preview: (dvipdfmx)}%
%% Same as in prtightpage.def
\ifx\PreviewBorder\@undefined
  \newdimen\PreviewBorder
  \PreviewBorder=0.50001bp
\fi
\ifx\PreviewBbAdjust\@undefined
  \def\PreviewBbAdjust{-\PreviewBorder -\PreviewBorder
    \PreviewBorder \PreviewBorder}
\fi
%% if active
\ifPreview\bxpw@dispatch@active \fi
%
}
\def\bxpw@dispatch@active{%
%
%% Same as in prtightpage.def
\def\pr@nextbb{\edef\next{\next\space\number\dimen@}%
  \expandafter\xdef\csname pr@bb@%
    \romannumeral\count@\endcsname{\the\dimen@}%
  \advance\count@\@ne\ifnum\count@<5
  \afterassignment\pr@nextbb\dimen@=\fi}%
\global\let\pr@bbadjust\@empty
\pr@addto@front\pr@ship@end{\begingroup
  \let\next\@gobble
  \count@\@ne\afterassignment\pr@nextbb
  \dimen@\PreviewBbAdjust
  \ifx\pr@bbadjust\next
  \else \global\let\pr@bbadjust\next
  \typeout{Preview: Tightpage \pr@bbadjust}%
  \fi\endgroup}%
%% post-shipout process for dvipdfmx
  \g@addto@macro\pr@ship@end{\dimen@\ht\pr@box
    \ifdim\dimen@<\z@ \dimen@\z@\fi
    \advance\dimen@\pr@bb@iv
    \dimen@ii=\dimen@
    \voffset=-1truein %% in → truein に変更
    \advance\voffset\dimen@
    \advance\voffset-\ht\pr@box
    \dimen@\dp\pr@box
    \ifdim\dimen@<\z@ \dimen@\z@\fi
    \advance\dimen@-\pr@bb@ii
    \advance\dimen@\dimen@ii
    \paperheight\dimen@
    \dimen@\wd\pr@box
    \ifdim\dimen@<\z@ \dimen@=\z@\fi
    \advance\dimen@-\pr@bb@i
    \advance\dimen@\pr@bb@iii
    \paperwidth\dimen@
    \divide\paperwidth\@m\relax %% 追加
    \divide\paperheight\@m\relax %% 追加
    \multiply\paperwidth\mag\relax %% 追加
    \multiply\paperheight\mag\relax %% 追加
    \setbox\pr@box\hbox{%
      \special{papersize=\the\paperwidth,\the\paperheight}%
      \box\pr@box}%
    \hoffset=-1truein %% in → truein に変更
    \advance\hoffset-\pr@bb@i
    \let\pr@offset@override\@empty}%
%
}
%% all done
\endinput

検証ソース

ZRさんの記事にあるサンプルを,10pt 以外で使用してみます。

% pLaTeX 文書
\documentclass[a4paper,17pt]{jsarticle}
\usepackage{plext}
\usepackage[active,dvipdfmx,tightpage]{preview}
\begin{document}
\begin{preview}\begin{minipage}<t>{6zw}
難波津に\\
咲くやこの花\\
冬籠り\\
今を春辺と\\
咲くやこの花
\end{minipage}\end{preview}
\end{document}

オリジナル版 prdvipdfmx.def での出力結果

f:id:doraTeX:20160822232846p:plain

改変版 prdvipdfmx.def での出力結果

f:id:doraTeX:20160822232723p:plain

うまく \mag 対応させることができたようです!☃