Skip to content

Instantly share code, notes, and snippets.

@zr-tex8r
Created August 5, 2014 10:41
Show Gist options
  • Star 0 You must be signed in to star a gist
  • Fork 0 You must be signed in to fork a gist
  • Save zr-tex8r/02186cab79cb50b05132 to your computer and use it in GitHub Desktop.
Save zr-tex8r/02186cab79cb50b05132 to your computer and use it in GitHub Desktop.
LaTeX: dvipdfmx で mediabb できるかも知れないやつ
% tcxmediabb.sty
%% package declaration
\NeedsTeXFormat{LaTeX2e}
\ProvidesPackage{tcxmediabb}[2014/08/05 v0.1]
%% preparations
\def\tcqmb@pkgname{tcxmediabb}
\def\tcqmb@error{\PackageError\tcqmb@pkgname}
\def\tcqmb@warn{\PackageWarningNoLine\tcqmb@pkgname}
\newif\iftcqmb@g@ok
%----------------------------- environment check
\tcqmb@g@oktrue
% mediabb must not be loaded yet
\@ifpackageloaded{mediabb}{%
\tcqmb@error{Package 'mediabb' is already loaded}%
{Package loading will be aborted.}%
\tcqmb@g@okfalse
}{}
% driver must be for dvipdfmx
\def\tcqmb@tmpa{dvipdfmx.def}%
\ifx\Gin@driver\tcqmb@tmpa\else
\tcqmb@error{Driver setting is not for dvipdfmx}%
{Package loading will be aborted.}%
\tcqmb@g@okfalse
\fi
% mediabb must be present
\IfFileExists{mediabb.sty}{}{%else
\tcqmb@error{Package 'mediabb' is not installed}%
{Package loading will be aborted.}%
\tcqmb@g@okfalse
}
% if something goes wrong, quit now
\iftcqmb@g@ok\else
\expandafter\endinput\fi\relax
%% debug messages
\ifx\tcxmediabbdebug\@undefined
\let\tcqmb@debug\@gobble
\else
\def\tcqmb@debug#1{\typeout{>>\tcqmb@pkgname: #1}}%
\fi
%--------------------------------------- do mediabb
%% save original things
\let\tcqmb@O@Ginclude@pdf\Ginclude@pdf
\let\tcqmb@O@Gread@pdf\Gread@pdf
\let\tcqmb@O@Gread@bmp\Gread@bmp
%% load the package!
\RequirePackage{mediabb}[2004/10/21]% v1.8 or later
% save mediabb things
\let\tcqmb@M@Gread@pdf\Gread@pdf
%--------------------------------------- repair things
%% restore originals
\@namedef{Gin@rule@.pdf}#1{{pdf}{.xbb}{#1}}
\let\Ginclude@pdf\tcqmb@O@Ginclude@pdf
\let\Gread@pdf\tcqmb@O@Gread@pdf
\let\Gread@bmp\tcqmb@O@Gread@bmp
%%<*> \setebbdirectorypath
\let\setebbdirectorypath\@gobble
\let\Gread@ebb@path\@empty
%%<*> 'autoebb' option
\define@key{Gin}{autoebb}[]{\Gread@ebb@never}
\def\Gread@ebb@never{%
\tcqmb@warn{Option 'autoebb' is annihilated}%
\global\let\Gread@ebb@never\relax}
\let\if@Gread@ebb@always\iffalse
\let\if@Gread@ebb@never\iftrue
\let\Gread@ebb@always\relax
\let\Gread@ebb@true\relax
\let\Gread@ebb@false\relax
%% \Gread@pdf{<xbb-file-path>}
% Inspects the bbox of the image (stored to \Gin@llx etc).
\def\Gread@pdf#1{%
\global\tcqmb@g@okfalse
\if@usebb\else % if mediabb process is enabled
\begingroup
\tcqmb@debug{\Gin@base\Gin@ext: try shallow parse}%
\global\tcqmb@g@oktrue
\def\Gread@bmp##1{% this is invoked in failure
\global\tcqmb@g@okfalse
\gdef\@gtempa{0 0 1 1 }% dummy
}%
\tcqmb@M@Gread@pdf{\Gin@base\Gin@ext}% arg#1 is pdf file
\endgroup
\tcqmb@debug{\Gin@base\Gin@ext:
\iftcqmb@g@ok ok (\@gtempa)\else ng\fi}%
\expandafter\Gread@parse@bb\@gtempa\\% do it again
\fi
\iftcqmb@g@ok\else
\tcqmb@debug{\Gin@base\Gin@ext: try read #1}%
\tcqmb@O@Gread@pdf{#1}%
% this always tells (right or wrong) bbox
\fi
\tcqmb@debug{\Gin@base\Gin@ext: bbox=(\@gtempa)}%
}
%--------------------------------------- all done
\endinput
%% EOF
@zr-tex8r
Copy link
Author

zr-tex8r commented Aug 5, 2014

以下のように、dvipdfmx ドライバの graphicx パッケージを読み込んだ後に、
mediabb の代わりに tcxmediabb パッケージを読み込む。
(tcxmediabb が内部で mediabb パッケージを読み込むので、mediabb.sty も必要。)

\usepackage[dvipdfmx]{graphicx}
\usepackage{tcxmediabb}

tcxmediabb パッケージを読み込むと、画像のbboxの取得の処理が以下のように変わる。

  • usebb オプションが無効(かつ bb 無指定)の場合、PDFを自力で読んでbboxを得ようと試みる。
  • 自力での解読が失敗した場合は、“通常の”処理に回る。
  • usebb が有効の場合は、常に“通常の”処理を行う。
  • EPSとビットマップ画像の読込については何も影響しない。
  • autoebb オプションの指定は無意味(警告が出る)。

Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment