documentclass で指定した用紙サイズを /BleedBox, /TrimBox に展開したい

documentclass で指定した用紙サイズを /BleedBox, /TrimBox に展開したい

- ヤバルゴ mdl.2 の投稿
返信数: 5
dvipdfmx の special 命令で用紙サイズを PDF のメタデータ( /BleedBox, /TrimBox )に記述したいのですが, documentclass や geometry で指定した用紙サイズを /BleedBox, /TrimBox に自動で展開する記述方法をご教授ください.
(lengthconvert パッケージで試してみましたが,上手く動きませんでした.)

以下にコードを記載します.また同じものをZIPで添付します.
(https://texwiki.texjp.org/?dvipdfmx#e2cc950a を参考にしました.)


%-----------------
\documentclass[uplatex,dvipdfmx,ja=standard,magstyle=real]{bxjsarticle}

% lengthconvertパッケージ
% 例の修正(https://okumuralab.org/tex/mod/forum/discuss.php?d=1673)
\usepackage{lengthconvert}
\ExplSyntaxOn
\cs_new:Npn \__lconv_calc_dim_fixed:n #1
{
  \fp_eval:n
    {
      round( \dim_to_fp:n { #1 } / (1\l__lconv_unit_tl) , \l__lconv_precision_int)
    }
}
\cs_set_eq:NN \__lconv_calc_dim:n \__lconv_calc_dim_fixed:n
\ExplSyntaxOff

% 代入したい位置
% 用紙サイズを bp に変換した数値を自動で代入できると嬉しい
\usepackage{bophook}
\AtBeginPage{
  \special{pdf:put @thispage <<
    /BleedBox [0 0 595.28 841.89] % ここ
    /TrimBox [0 0 595.28 841.89] % ここ
  >>}
}


% 以下,おまけ
% 自力で改造しているので,間違っている可能性あり
\usepackage{datetime}
\renewcommand{\dateseparator}{-}
\title{My title}
\author{My name}
\date{\yyyymmdddate\today}

\AtBeginDvi{
  \special{pdf:tounicode UTF8-UTF16}
  \special{pdf:docinfo <<
    /Title (My title)
    /Subject (My subtitle)
    /Author (My name)
    /CreationDate (D:\pdfdate+09'00')
    /ModDate (D:\pdfdate+09'00')
    /Keywords (My keywords)
  >>}
}

\AtBeginDvi{
  \special{pdf:minorversion 3}
  \special{pdf:docinfo <<
    /Trapped /False
    /GTS_PDFXVersion (PDF/X-1:2001)
    /GTS_PDFXConformance (PDF/X-1a:2001)
  >>}
  \special{pdf:docview <<
    /OutputIntents [ <<
      /Type /OutputIntent
      /S /GTS_PDFX
      /OutputConditionIdentifier (JC200103)
      /OutputCondition (JC200103 (Japan Color 2001 Coated))
      /RegistryName (http://www.color.org)
    >> ]
  >>}
}

\begin{document}

\verb|\Convert[unit=bp,precision=2,number-only]{\paperwidth} ->|
\Convert[unit=bp,precision=2,number-only]{\paperwidth} % 595.28

\verb|\Convert[unit=bp,precision=2,number-only]{\paperheight} ->|
\Convert[unit=bp,precision=2,number-only]{\paperheight} % 841.89

\verb|\Convert|は\verb|document|環境でしか使えないのかな?

一応,プリフライトでPDF/X-1a準拠と確認できるものができあっている.

\end{document}
ヤバルゴ mdl.2 への返信

Re: documentclass で指定した用紙サイズを /BleedBox, /TrimBox に展開したい

- ヤバルゴ mdl.2 の投稿
質問したい点が不明瞭であったため,追記させていただきます.

用紙サイズを /BleedBox, /TrimBox に自動で展開させたいので, lengthconvert パッケージによる数値変換の命令を以下のように記述しました.

%----------
% 代入したい位置
% 用紙サイズを bp に変換した数値を自動で代入できると嬉しい
\usepackage{bophook}
\AtBeginPage{
  \special{pdf:put @thispage <<
    /BleedBox [0 0 \Convert[unit=bp,precision=2,number-only]{\paperwidth} \Convert[unit=bp,precision=2,number-only]{\paperheight}] % ここ
    /TrimBox [0 0 \Convert[unit=bp,precision=2,number-only]{\paperwidth} \Convert[unit=bp,precision=2,number-only]{\paperheight}] % ここ
  >>}
}
%----------

このコードでdvipdfmxでPDFに変換すると,

%----------
dvipdfmx:warning: Unknown PDF object type.
dvipdfmx:warning: Could not find a valid object in array object.
dvipdfmx:warning: Could not find a value in dictionary object.
dvipdfmx:warning: Missing (an) object(s) to put into "thispage"!
dvipdfmx:warning: Interpreting special command put (pdf:) failed.
dvipdfmx:warning: >> at page="1" position="(3.32089, 841.89)" (in PDF)
dvipdfmx:warning: >> xxx "pdf:put @thispage << /BleedBox [0 0 \group_begin: \keys_set:..."
dvipdfmx:warning: >> Reading special command stopped around >><< /BleedBox [0 0 \group_begin: \keys_set:nn {lengthconvert}...<<
%----------

となり,正しく数値として展開されません.
この部分をうまく数値として入力できるようにしたい,と考えております.
ヤバルゴ mdl.2 への返信

Re: documentclass で指定した用紙サイズを /BleedBox, /TrimBox に展開したい

- Z. R. の投稿
正しく数値として展開されません.

確かにその通りで、

\special{... \Convert[...]{...} ...}

のような構成が正しく動作するには、\Convert が目的の数値(の数字列)“に展開される”必要があります。しかし、lengthconvert のマニュアルを見ると、

After the conversion the result will be printed.

とある通りで、\Convert 命令(および lengthconvert の全ての命令)は「版面に結果を出力する」ことしか想定されていないのでこの場合にはそもそも利用できないわけです。

※TeX 言語では基本的に“展開できる方が珍しい”ので、もしそのように実装されているならマニュアルの当該命令の解説では、「~に展開する(expand to)」「(完全)展開可能((fully-)expandable)」などの表現が用いられているはずです。

では、今の場合はどうすればいいかというと、もし「結果に展開するマクロを作る」ことに拘るならば、

  • l3fp の実数演算命令は完全展開可能(!)なので、それを直接利用する

という方法が考えられます。ただこのためには「expl3 の言語」を習得する必要があるので容易ではありません。TeX 言語の初級者にとって割と習得しやすい方法として:

  • pgfmath パッケージの実数演算機能を利用する

を推奨します。

以下に(まるで意味のない)サンプルを示します。

\documentclass[a4paper]{article}
\usepackage{pgfmath}
\makeatletter %!!!!!!!!!!!!!!!!! TeX code BEGIN
\AtBeginDvi{%
% 長さ値は単にpt単位の数値として扱われる. 結果は単位無し.
\pgfmathsetmacro\xx@x{\paperwidth/10}%
\pgfmathsetmacro\xx@y{sqrt(\paperheight)}%
\special{papersize=\xx@x pt,\xx@y pt}}
\makeatletter %!!!!!!!!!!!!!!!!! TeX code END
\begin{document}
Hello!
\end{document}
Z. R. への返信

Re: documentclass で指定した用紙サイズを /BleedBox, /TrimBox に展開したい

- ヤバルゴ mdl.2 の投稿
回答有り難うございます.

Z. R. さま が示された pgfmath パッケージの機能を用いて,目的の数値を展開することは出来ました.

%------
\usepackage{pgfmath}
\pgfmathsetmacro\bpPaperWidth{\paperwidth/72.27*72}
\pgfmathsetmacro\bpPaperHeight{\paperheight/72.27*72}

\usepackage{bophook}
\AtBeginPage{
  \special{pdf:put @thispage <<
    /BleedBox [0 0 \bpPaperWidth  \bpPaperHeight]
    /TrimBox [0 0 \bpPaperWidth  \bpPaperHeight]
  >>}
}
%------

しかし,TeXの仕様のせいか,\bpPaperWidth と \bpPaperHeight の間のスペースが無視されるらしく,

%------
dvipdfmx:warning: Could not find a numeric object.
dvipdfmx:warning: Could not find a valid object in array object.
dvipdfmx:warning: Could not find a value in dictionary object.
dvipdfmx:warning: Missing (an) object(s) to put into "thispage"!
dvipdfmx:warning: Interpreting special command put (pdf:) failed.
dvipdfmx:warning: >> at page="1" position="(3.32089, 841.89)" (in PDF)
dvipdfmx:warning: >> xxx "pdf:put @thispage << /BleedBox [0 0 595.27551841.89001] /Tri..."
dvipdfmx:warning: >> Reading special command stopped around >><< /BleedBox [0 0 595.27551841.89001] /TrimBox [0 0 595.2755...<<
%------

のように,「595.27551841.89001」として展開されています.(「595.27551 841.89001」となってほしい.)

この問題の解決方法をご教授してくださると幸いです.
ヤバルゴ mdl.2 への返信

Re: documentclass で指定した用紙サイズを /BleedBox, /TrimBox に展開したい

- 前田 一貴 の投稿
\space を使うとどうでしょうか.

\AtBeginPage{
  \special{pdf:put @thispage <<
    /BleedBox [0 0 \bpPaperWidth\space\bpPaperHeight]
    /TrimBox [0 0 \bpPaperWidth\space\bpPaperHeight]
  >>}
}
前田 一貴 への返信

Re: documentclass で指定した用紙サイズを /BleedBox, /TrimBox に展開したい

- ヤバルゴ mdl.2 の投稿
回答有り難うございます.

前田 さまの示された方法で解決いたしました.

Z. R. さま, 前田 さま,ありがとうございました.

(追記:前の投稿の際,敬称を付け忘れておりました.今は直っておりますが,Z. R. さまがご覧になられていましたら申し訳ございません.)


%---以下,うまく動いたときの記録
\documentclass[uplatex,dvipdfmx,ja=standard,magstyle=real]{bxjsarticle}

\usepackage{pgfmath}
\pgfmathsetmacro\bpPaperWidth{\paperwidth/72.27*72}
\pgfmathsetmacro\bpPaperHeight{\paperheight/72.27*72}

% 代入したい位置
% 用紙サイズを bp に変換した数値を自動で代入できると嬉しい
\usepackage{bophook}
\AtBeginPage{
  \special{pdf:put @thispage <<
    /BleedBox [0 0 \bpPaperWidth\space\bpPaperHeight]
    /TrimBox [0 0 \bpPaperWidth\space\bpPaperHeight]
  >>}
}

% 以下,おまけ
% 自力で改造しているので,間違っている可能性あり
\usepackage{datetime}
\renewcommand{\dateseparator}{-}
\title{My title}
\author{My name}
\date{\yyyymmdddate\today}

\AtBeginDvi{
  \special{pdf:tounicode UTF8-UTF16}
  \special{pdf:docinfo <<
    /Title (My title)
    /Subject (My subtitle)
    /Author (My name)
    /CreationDate (D:\pdfdate+09'00')
    /ModDate (D:\pdfdate+09'00')
    /Keywords (My keywords)
  >>}
}

\AtBeginDvi{
  \special{pdf:minorversion 3}
  \special{pdf:docinfo <<
    /Trapped /False
    /GTS_PDFXVersion (PDF/X-1:2001)
    /GTS_PDFXConformance (PDF/X-1a:2001)
  >>}
  \special{pdf:docview <<
    /OutputIntents [ <<
      /Type /OutputIntent
      /S /GTS_PDFX
      /OutputConditionIdentifier (JC200103)
      /OutputCondition (JC200103 (Japan Color 2001 Coated))
      /RegistryName (http://www.color.org)
    >> ]
  >>}
}

\begin{document}

\bpPaperWidth

\bpPaperHeight

\end{document}