pLaTeX と standalone パッケージ(TikZとTexLive2012使用時)

pLaTeX と standalone パッケージ(TikZとTexLive2012使用時)

- H R の投稿
返信数: 12
TikZ、standaloneパッケージ、pLaTeXを使いコンパイルするとエラーが出ます。回避方法をご教示願えれば幸いです。(TexLive2012を使用)

以下に簡単な例を説明します。

(1)TikZでコードを書き、standaloneパッケージを使い、以下のコードをコンパイルしながら図を確かめる。この段階では、pLaTeXもしくはLaTeXでコンパイルしてもエラーは発生しない。(.pdfファイルはdvipsとps2pdfで作成)
(このファイルを figure.tex として保存)
\documentclass{standalone}
\usepackage{tikz}
\begin{document}
\begin{tikzpicture}
 \draw [help lines] (-1,-1) grid (1,1);
\end{tikzpicture}
\end{document}

(2)以下のメインの.tex ファイルを作成し、pLaTeXでコンパイルする。この段階でエラーが発生する。一方、LaTeXでコンパイルしてもエラーは出ない。
\documentclass{article}
\usepackage{standalone}
\usepackage{tikz}
\begin{document}
\input{figure.tex}
\end{document}

.logファイルの一部は以下のようになっています。

(/usr/local/texlive/2012/texmf-dist/tex/latex/filemod/filemod-expmin.sty
Package: filemod-expmin 2011/09/19 v1.2 Get and compare file modification times
 (expandable; minimal)

(/usr/local/texlive/2012/texmf-dist/tex/generic/oberdiek/pdftexcmds.sty
Package: pdftexcmds 2011/11/29 v0.20 Utility functions of pdfTeX for LuaTeX (HO
)
Package pdftexcmds Info: LuaTeX not detected.
Package pdftexcmds Info: pdfTeX >= 1.30 not detected.
Package pdftexcmds Info: \pdf@primitive is not available.
Package pdftexcmds Info: \pdf@ifprimitive is not available.
Package pdftexcmds Info: \pdfdraftmode not found.
)

/usr/local/texlive/2012/texmf-dist/tex/latex/filemod/filemod-expmin.sty:36: Pac
kage filemod Error: Required command \pdffilemoddate is not defined!.

See the filemod package documentation for explanation.
Type  H <return>  for immediate help.
 ...                                              
 
l.36 ...date\space is not defined!}{\filemod@help}
 
The required command \pdffilemoddate is not defined. This means that the used  
LaTeX compiler does not support it. Please make sure that pdfLaTeX 1.30.0 or   
newer or LuaLaTeX is used. XeLaTeX does not support reading file modification  
dates. 


H R への返信

Re: pLaTeX と standalone パッケージ(TikZとTexLive2012使用時)

- Akira Kakuto の投稿
\pdffilemoddate は pdftex でしかサポートされていないから
エラーになると思います。特に必要ないなら

\documentclass{article}
\def\pdffilemoddate{\relax}
\usepackage{standalone}
\usepackage{tikz}
\begin{document}
\begin{tikzpicture}
 \draw [help lines] (-1,-1) grid (1,1);
\end{tikzpicture}
\end{document}

でこちらでは platex を通ります。

Akira Kakuto への返信

Re: pLaTeX と standalone パッケージ(TikZとTexLive2012使用時)

- Akira Kakuto の投稿
例を間違っていました。
\documentclass{article}
\def\pdffilemoddate{\relax}
\usepackage{standalone}
\usepackage{tikz}
\begin{document}
\input{figure.tex}
\end{document}
でしたね。

Akira Kakuto への返信

Re: pLaTeX と standalone パッケージ(TikZとTexLive2012使用時)

- H R の投稿
返信有り難うございます。
エラーがなくなりました。
非常に助かりました。

H R への返信

Re: pLaTeX と standalone パッケージ(TikZとTexLive2012使用時)

- 匿 名 の投稿
\pdffilemoddate をfakeにしただけでは
\usepackage[mode=buildnew]{standalone}

\includestandalone[mode=buildnew]{figure}
などの mode=buildnew が使えません。
-shell-escape を有効にしてもよいならば、たとえばUNIX系OSなら

%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
% [1] \usepackage{standalone} の前に
\providecommand*{\pdf@filemoddate}[1]{D:00000000000000Z} % fake!
\RequirePackage{filemod-expmin}
\renewcommand*\filemodCmp[2]{%
\immediate\write18{ if [ #1 -ot #2 ] ;then touch #2_is_newer ; else touch #1_is_newer_or_same; fi }%
\IfFileExists{#2_is_newer}{%
\immediate\write18{ rm -f #2_is_newer }\expandafter\@secondoftwo}{%
\immediate\write18{ rm -f #1_is_newer_or_same }\expandafter\@firstoftwo}}

% [2] \usepackage{standalone} の後に
\makeatletter
\def\sa@graphicext{.pdf}
\def\sa@build@postcommand{dvipdfmx -o '\file.pdf' '\file.dvi'}
\def\sa@build@latex{platex}
\makeatother
%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%

とすることで使えるようになります。
\write18{}の中身は、OSに合わせて書き換えて下さい。
匿 名 への返信

Re: pLaTeX と standalone パッケージ(TikZとTexLive2012使用時)

- 匿 名 の投稿
[1]の方に \makeatletter 〜 \makeatother をつけるのを忘れてました。
匿 名 への返信

Re: pLaTeX と standalone パッケージ(TikZとTexLive2012使用時)

- H R の投稿
ありがとうございます。

Mac OS X Mountain Lionを使っているのですが、\write18{}の中身どうすれば良いのでしょうか。教えて頂ければ、助かります。よろしくお願いします。
H R への返信

Re: pLaTeX と standalone パッケージ(TikZとTexLive2012使用時)

- 匿 名 の投稿
Mac OS X は UNIX系なので、そのままで使えると思います。
ただし私はLinuxしか持っていないので、確認が出来ません。

あと、先に投稿したのはエラー処理を略したものだったので、エラー処理付きのものを載せます。

%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
\makeatletter
\providecommand{\pdf@filemoddate}[1]{D:00000000000000Z} % fake!
\RequirePackage{filemod-expmin}
\renewcommand*\filemodCmp[2]{%
\immediate\write18{if [ #2 -nt #1 ] ;then touch #2_is_newer ; else touch #1_is_newer_or_same; fi}%
\IfFileExists{#2_is_newer}{%
\immediate\write18{rm -f #2_is_newer}\expandafter\@secondoftwo%
}{%
\IfFileExists{#1_is_newer_or_same}{%
\immediate\write18{rm -f #1_is_newer_or_same}\expandafter\@firstoftwo%
}{%
\PackageError{filemod-expmin}{Failed to compare mtime of #1 and #2.^^J%
Needs shell escape. Use the '-shell-escape' option}{}%
}}}
\makeatother
%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
匿 名 への返信

Re: pLaTeX と standalone パッケージ(TikZとTexLive2012使用時)

- H R の投稿
ありがとうございました。
これで安心してstandaloneを使えそうです。
H R への返信

Re: pLaTeX と standalone パッケージ(TikZとTexLive2012使用時)

- tat tsan の投稿
-shell-escape はセキュリティホールになりますので、「安心して」は使わないで下さいね。
「タイプセットしているTeXソース自身と、読み込んでいる全ての file・package が信頼できる」場合にのみ mode=buildnew をご利用ください。
Akira Kakuto への返信

Re: pLaTeX と standalone パッケージ(TikZとTexLive2012使用時)

- 北川 弘典 の投稿
遅くなりましたが,e-(u)pTeX で \pdffilemoddate, \pdfcreationdate,
\pdffilesize をサポートするパッチを作ってみました.
# ほぼ pdfTeX のコードそのままです.

e-pTeX wiki (http://sourceforge.jp/projects/eptex/wiki/FrontPage ) に
eptex-pdffilemoddate-130605.diff.xz としておきました.
北川 弘典 への返信

Re: pLaTeX と standalone パッケージ(TikZとTexLive2012使用時)

- Akira Kakuto の投稿
いつもながらありがとうございます。
W32TeXで build しておきました:

e-pTeX 3.1415926-p3.4-130605-2.6
e-upTeX 3.1415926-p3.4-u1.11-130605-2.6

北川 弘典 への返信

Re: pLaTeX と standalone パッケージ(TikZとTexLive2012使用時)

- tat tsan の投稿
ありがとうございます! Buildして、standaloneパッケージを使ってみました。
\usepackage[mode=buildnew]{standalone} や \includestandalone[mode=buildnew]{file名} の
オプション mode=buildnew が正しく機能しています。素晴らしい!

なお XeLaTeX で mode=buildnew を用いると、warining と共に mode=build へと変更されます。これで XeTeX エンジンでは出来ないことが pTeX では出来るようになりました。