2015年7月27日

pdfpagesパッケージをdvipdfmxで使う場合は

\includepdf[pages=-,lastpage=9]{inc.pdf}
のようにlastpageでページ数を指定しなければならないという話だったけど,extractbbが起動できればページ数も取得できるなと思ったので遊んでみた.ドライバ内で定義されている\AM@getpagecountを書き換えればよいっぽいのでそうしてみた.

\documentclass[dvipdfmx]{jsarticle}
\usepackage{pdfpages}
\makeatletter
\catcode37=12\relax
\long\def\@find@pages#1:#2\relax{\def\@tempb{#1}\def\@tempc{%%Pages}\ifx\@tempb\@tempc\@set@AM@pagecount#2\fi}
\catcode37=14\relax
\def\@set@AM@pagecount#1:{\def\AM@pagecount{#1}}
\def\AM@getpagecount{%
  \ifx\AM@pagecount\AM@undefined
    \immediate\openin\@inputcheck="|extractbb -O \AM@currentdocname"%
    \@tempswatrue
    \loop
      \ifeof\@inputcheck
        \@tempswafalse
      \else
        \catcode37=12\relax
        \immediate\read\@inputcheck to \@tempa
        \catcode37=14\relax
        \expandafter\@find@pages\@tempa:\relax
      \fi
    \if@tempswa\repeat
    \immediate\closein\@inputcheck
  \fi
  \ifx\AM@pagecount\AM@undefined\def\AM@pagecount{1}\fi
}
\makeatother
\begin{document}
\includepdf[nup=2x1,pages=-]{inc.pdf}
\end{document}

改変無しの場合はinc.pdfが複数ページでも最初のページしかで読まれないけど,これだと全部読まれる. ppdvipdfmx.defの該当箇所を変更して試してみたりもした.とりあえず動いていそうだけど,どんなとこでもきちんと動くかはあまり自信ない(プロセス起動怖い……).以下パッチ.

--- ppdvipdfmx.def.orig 2015-07-26 21:46:10 +0000
+++ ppdvipdfmx.def 2015-07-26 21:48:33 +0000
@@ -52,10 +52,27 @@
   Driver `dvipdfmx' cannot detect the total number\MessageBreak
   of pages of a PDF. Use option `lastpage' to give\MessageBreak
   me a hint}
+\catcode37=12\relax
+\long\def\@find@pages#1:#2\relax{\def\@tempb{#1}\def\@tempc{%%Pages}\ifx\@tempb\@tempc\@set@AM@pagecount#2\fi}
+\catcode37=14\relax
+\def\@set@AM@pagecount#1:{\def\AM@pagecount{#1}}
 \def\AM@getpagecount{%
   \ifx\AM@pagecount\AM@undefined
-    \def\AM@pagecount{1}%
+    \immediate\openin\@inputcheck="|extractbb -O \AM@currentdocname"%
+    \@tempswatrue
+    \loop
+      \ifeof\@inputcheck
+        \@tempswafalse
+      \else
+        \catcode37=12\relax
+        \immediate\read\@inputcheck to \@tempa
+        \catcode37=14\relax
+        \expandafter\@find@pages\@tempa:\relax
+      \fi
+    \if@tempswa\repeat
+    \immediate\closein\@inputcheck
   \fi
+  \ifx\AM@pagecount\AM@undefined\def\AM@pagecount{1}\fi
 }
 \newcommand*{\AM@checkpagenumber}[1]{}
 \def\AM@getpagedimen{%

4 件のコメント:

  1. Noriyuki Abe さんによるパッチということで, Andreas さんに送っておきました。
    無断で後報告になって,すみません。 角藤

    返信削除
  2. ありがとうございます.助かります.

    返信削除
  3. Thank you very much for this patch. This is an interesting idea. Looks good to me.
    Unfortunatey I cannot test it right now (my brain is my only parser at hand right now). I won't have access to my computer for the next 2 weeks.
    When I'm back I will take a deeper look at it. But from what I have seem so far I'm sure it's worth to add this patch. I'll let you know..
    非常に喜んでおられるようです。時間ができ次第採用するということです。 角藤

    返信削除
  4. それはよかったです.やりとりをお任せしてしまってすみませんでした.ありがとうございます.

    返信削除

コメントの追加にはサードパーティーCookieの許可が必要です