Skip to content

Instantly share code, notes, and snippets.

@aminophen
Last active December 25, 2015 20:01
Show Gist options
  • Save aminophen/dd196d5cc17ebac6d75d to your computer and use it in GitHub Desktop.
Save aminophen/dd196d5cc17ebac6d75d to your computer and use it in GitHub Desktop.
LaTeX の graphics / color ドライバ指定を「初回指定のみ有効」にするハック
diff -urN orig/color.cfg new/color.cfg
--- orig/color.cfg Fri May 31 12:10:50 2013
+++ new/color.cfg Sat Dec 26 04:52:04 2015
@@ -1,6 +1,30 @@
\ProvidesFile{color.cfg}%
[2007/01/18 v1.5 color configuration of teTeX/TeXLive]
+% Restore current definition of \Gin@driver (might be empty)
+\let\Gin@driver@prev\Gin@driver
+
+% suppress loading more than one drivers
+\begingroup\expandafter\expandafter\expandafter\endgroup
+\expandafter\ifx\csname AtEndOfPackage\endcsname\relax
+\else
+ \AtEndOfPackage{%
+ \if!\Gin@driver@prev!{}\else{%
+ \ifx\Gin@driver@prev\Gin@driver{}\else{%
+ \@latex@error{%
+ More than one graphics drivers detected:\MessageBreak%
+ \space\space `\Gin@driver@prev' and `\Gin@driver'%
+ }{%
+ Be sure to give a proper driver option to `(x)color'\MessageBreak%
+ package in your LaTeX code.\MessageBreak%
+ If you type <return> now, I'll stick to the first driver `\Gin@driver@prev'.%
+ }%
+ }\fi
+ }\fi
+ \InputIfFileExists{drvlist.cfg}{}{}
+ }%
+\fi
+
% Select an appropriate default driver
\begingroup
\chardef\x=0\relax
diff -urN orig/drvlist.cfg new/drvlist.cfg
--- orig/drvlist.cfg Thu Jan 01 09:00:00 1970
+++ new/drvlist.cfg Sat Oct 31 05:05:22 2015
@@ -0,0 +1,29 @@
+% Public domain.
+% Written by Hironobu YAMASHITA based on graphics.sty and color.sty.
+\ProvidesFile{drvlist.cfg}%
+ [2015/10/26 v1.1 list of graphics and color driver files]
+\@ifundefined{ifGin@driver@listed}{%
+ \newif\ifGin@driver@listed
+}{%
+ \let\Gin@driver\Gin@driver@prev\relax
+}
+\@ifundefined{ver@dvips.def}{\@namedef{ver@dvips.def}{1999/01/01}}{}
+\@ifundefined{ver@dvipdf.def}{\@namedef{ver@dvipdf.def}{1999/01/01}}{}
+\@ifundefined{ver@dvipdfmx.def}{\@namedef{ver@dvipdfmx.def}{1999/01/01}}{}
+\@ifundefined{ver@xetex.def}{\@namedef{ver@xetex.def}{1999/01/01}}{}
+\@ifundefined{ver@pdftex.def}{\@namedef{ver@pdftex.def}{1999/01/01}}{}
+\@ifundefined{ver@dvipsone.def}{\@namedef{ver@dvipsone.def}{1999/01/01}}{}
+\@ifundefined{ver@emtex.def}{\@namedef{ver@emtex.def}{1999/01/01}}{}
+\@ifundefined{ver@dviwin.def}{\@namedef{ver@dviwin.def}{1999/01/01}}{}
+\@ifundefined{ver@textures.def}{\@namedef{ver@textures.def}{1999/01/01}}{}
+\@ifundefined{ver@pctexps.def}{\@namedef{ver@pctexps.def}{1999/01/01}}{}
+\@ifundefined{ver@pctexwin.def}{\@namedef{ver@pctexwin.def}{1999/01/01}}{}
+\@ifundefined{ver@pctexhp.def}{\@namedef{ver@pctexhp.def}{1999/01/01}}{}
+\@ifundefined{ver@pctex32.def}{\@namedef{ver@pctex32.def}{1999/01/01}}{}
+\@ifundefined{ver@truetex.def}{\@namedef{ver@truetex.def}{1999/01/01}}{}
+\@ifundefined{ver@tcidvi.def}{\@namedef{ver@tcidvi.def}{1999/01/01}}{}
+\@ifundefined{ver@vtex.def}{\@namedef{ver@vtex.def}{1999/01/01}}{}
+% for W32TeX
+\@ifundefined{ver@dvipdfm.def}{\@namedef{ver@dvipdfm.def}{1999/01/01}}{}
+\@ifundefined{ver@dviout.def}{\@namedef{ver@dviout.def}{1999/01/01}}{}
+\endinput
diff -urN orig/graphics.cfg new/graphics.cfg
--- orig/graphics.cfg Thu May 30 18:16:30 2013
+++ new/graphics.cfg Sat Dec 26 04:52:01 2015
@@ -3,6 +3,30 @@
\ProvidesFile{graphics.cfg}%
[2010/04/23 v1.9 graphics configuration of TeX Live]%
+% Restore current definition of \Gin@driver (might be empty)
+\let\Gin@driver@prev\Gin@driver
+
+% suppress loading more than one drivers
+\begingroup\expandafter\expandafter\expandafter\endgroup
+\expandafter\ifx\csname AtEndOfPackage\endcsname\relax
+\else
+ \AtEndOfPackage{%
+ \if!\Gin@driver@prev!{}\else{%
+ \ifx\Gin@driver@prev\Gin@driver{}\else{%
+ \@latex@error{%
+ More than one graphics drivers detected:\MessageBreak%
+ \space\space `\Gin@driver@prev' and `\Gin@driver'%
+ }{%
+ Be sure to give a proper driver option to `graphics(x)'\MessageBreak%
+ package in your LaTeX code.\MessageBreak%
+ If you type <return> now, I'll stick to the first driver `\Gin@driver@prev'.%
+ }%
+ }\fi
+ }\fi
+ \InputIfFileExists{drvlist.cfg}{}{}
+ }%
+\fi
+
% Select an appropriate default driver
\begingroup
\chardef\x=0\relax
@aminophen
Copy link
Author

まだこのパッチには問題点がある。ご利用は自己責任で。詳細はブログ記事参照。

@aminophen
Copy link
Author

このパッチの “筋が良いかどうか” などの論点:

  • 警告ではなくエラーを返すべきではないか?2015.12.26 変更により解消
    • \@latex@warning@no@line\@latex@error に変更すればよい。そのときはエラーメッセージをエラーらしく変更する(いま警告を採用しているのは、最初にこのパッチを公開したときの分岐がよくなかった名残にすぎない…)。
    • ただ、エラーにするとして -interaction=nonstopmode のときに複数のドライバファイル (.def) を読ませるべきか読ませないべきかは大事になる。仮に現状のマクロを取りこむと、必然的に2番目以降のドライバファイルは読みこむことができない状態になっているので、\Gin@driver の定義を元に戻すべきだろう(どうせそうするならもはや警告でよいのではないかという気もする…)。
  • 複数ドライバファイル (.def) を読み込み可能にしている原因は graphics.sty や (x)color.sty 本体なので、本体にパッチをあてるほうがよいのではないか?
    • 本体は \InputIfFileExists で .cfg を読み込むので、ディストリビューションが .cfg を持たない状況ならそもそも「デフォルトが存在することに起因する意図しない複数のドライバファイル読み込み」は起きないはずである(複数読み込みは依然として可能なので「衝突するドライバオプションを明示的に指定した場合のドライバファイルの複数読み込み」はありえるが、それはユーザが悪い)。だから .cfg を用意したディストリビューションの側で、複数読み込みを起こさないように配慮することにも一理ある。

その他、ご意見をお寄せください。

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