マクロツイーター

はてダから移行した記事の表示が崩れてますが、そのうちに直せればいいのに(えっ)

/Rotate する pdf:epdf に関するメモ

dvipdfmx が /Rotate 指定付きの PDF 画像の挿入に対応させる場合、仕様はどうすべきか、という話。

注意事項。

  • dvipdfmx において PDF 画像の挿入を行う special 命令が pdf:epdf 命令。
  • 従来の dvipdfmx では、pdf:epdf が挿入する PDF 画像がゼロでない /Rotate の値を持っていた場合は「/Rotate は未対応(Not supported yet)」という警告メッセージが出て、/Rotate 指定が無視される(回転しない)。
  • 以下の例で、snowman,pdf は「/Rotate 270」の指定を持っていると仮定する。
  • dvipdfmx(pdf:epdf 命令)の仕様だけでなく、extractbb や \includegraphics の仕様についても考える必要がある。

今のところの案。

  • /Rotate の設定を無視する」という動作を“仕様”であると認定する。この場合、従来通りの指定の動作は変えてはいけない。
    pdf:epdf (snowman.df)         →回転なし
    • pdf:epdf 命令に回転角度を示す rotate パラメタを新設する。PDF自体がもつ /Rotate の値は見ない。
      pdf:epdf rotate 270 (snowman.pdf) →270度回転
      pdf:epdf rotate 180 (snowman.pdf) →180度回転
    • pdf:epdf 命令に回転角度を示す rotate パラメタを新設する。ただし PDF 自体がもつ /Rotate の値以外が指定された場合はエラーとする。
      pdf:epdf rotate 270 (snowman.pdf) →270度回転
      pdf:epdf rotate 180 (snowman.pdf) →エラー
    • pdf:epdf 命令に「回転を適用するか」を示す userotate パラメタを新設する。この値が 1 の時は PDF の /Rotate の値に従って回転する。0 の時は回転しない。
      pdf:epdf userotate 1 (snowman.pdf) →270度回転
      pdf:epdf userotate 0 (snowman.pdf) →回転なし
    • pdf:epdf 命令の「回転を適用する」変種として pdf:epdf☃ 命令(名前は仮)を新設する。この新しい命令は PDF の /Rotate の値に従って回転する。
      pdf:epdf☃ userotate 1 (snowman.pdf) →270度回転
      
    これらの仕様を採用した場合、ドライバ☃は /Rotate 指定付の PDF については「回転させる」方の命令記述を使う。/Rotate がない(またはゼロ)の場合は「回転させる」方でも従来の方でも構わない。
  • /Rotate の設定を無視する」という動作を“仕様”とは認定しない。本来は回転すべきであったが未対応のため不正な結果になったと見なす。この場合、従来通りの指定は「本来は回転すべき」なので、/Rotate の値に従って回転させる。
    pdf:epdf (snowman.df)         →270度回転
    ただこの方式には問題がある。/Rotate 付き PDF について従来の .xbb ファイルを用いて LaTeX コンパイルが行われた場合、回転なしとして扱って DVI に pdf:epdf 命令を作成する。これを新しい dvipdfmx で処理するとこの命令を回転ありと扱うため支離滅裂な出力になってしまう。ただし、この項においては、従来の動作(一見まともな出力だが回転が無視されている)も“不正な結果”と見なされていることに注意。
    • ⑤ 一見まともだろうが支離滅裂だろうが不正である点は変わらないので、何も対策しない。
    • ⑥ 従来の .xbb と新しい .xbb が確実に区別がつくようにする。(例えば、ゼロであっても必ず /Rotate の値を出力に含める。)そして、新しいものでない場合は(支離滅裂な出力が予期されるので)エラーにする。
    • ⑦ ⑥と同様だが、エラーでなく警告扱いにして結果自体は出力する。(従来の動作が「不正であるが警告扱い」だったのでそれに合わせる。)