如何在 \pdfpageattr 中使用宏

如何在 \pdfpageattr 中使用宏

我想使用宏将/MediaBox/BleedBox和设置为实际页面大小。但看起来这是读取标记列表,而不是“常规宏”(如果我理解得没错的/CropBox话)。由于我不是 expandafterguru,因此我无法实现这一点。/TrimBox\pdfpageattr

以下 MNWE 未产生预期的结果:

\documentclass{article}

\makeatletter
\edef\pwpt{\strip@pt\dimexpr0.996264009963\paperwidth\relax} %paper width in PS points
\edef\phpt{\strip@pt\dimexpr0.996264009963\paperheight\relax} %paper height in PS points
\makeatother

\begin{document}

Paper width is \pwpt\ PS points

Paper height is \phpt\ PS points

\pdfpageattr{
/MediaBox [0 0 \pwpt \phpt]
/BleedBox [0.00000 0.00000 \pwpt \phpt]
/CropBox [0 0 \pwpt \phpt]
/TrimBox [0.00000 0.00000 \pwpt \phpt]
}

\end{document}

没有编译错误,但是生成的pdf无效。

注意:我试图自动化这个答案

答案1

这是一个使用\expandafter和的解决方案\space

使用\pdfcompresslevel 0\pdfobjcompresslevel 0进入序言,您可以直接验证 PDF 文档:

/媒体框 [0 0 611.9985 791.99806]
 /出血框 [0.00000 0.00000 611.9985 791.99806]
 /裁剪框 [0 0 611.9985 791.99806]
 /修剪框 [0.00000 0.00000 611.9985 791.99806]
\documentclass{article}

\pdfcompresslevel 0
\pdfobjcompresslevel 0

\makeatletter
\edef\pwpt{\strip@pt\dimexpr0.996264009963\paperwidth\relax} %paper width in PS points
\edef\phpt{\strip@pt\dimexpr0.996264009963\paperheight\relax} %paper height in PS points
\makeatother

\begin{document}

Paper width is \pwpt\ PS points

Paper height is \phpt\ PS points

\edef\mypdfpageattr{
/MediaBox [0 0 \pwpt\space\phpt]^^J
/BleedBox [0.00000 0.00000 \pwpt\space\phpt]^^J
/CropBox [0 0 \pwpt\space\phpt]^^J
/TrimBox [0.00000 0.00000 \pwpt\space\phpt]
}
\expandafter\pdfpageattr\expandafter{\mypdfpageattr}
\end{document}

答案2

我使用 luatex,但在 bp 长度的计算准确性方面遇到了一些麻烦:Media|BleedBox 和 TrimBoxes 之间的距离测量结果报告为 4.97mm 而不是 5mm(Acrobat 预检报告的另一个距离为 4.98mm)。

在我使用 expl3 之后,\dim_to_decimal_in_bp问题就消失了:5mm == 5mm。;-)

以下代码应该可以展示出[稍微]的差异(至少在宽度方面):

\RequirePackage{luatex85}
\pdfcompresslevel=0
\pdfobjcompresslevel=0
\documentclass[12pt]{article}
\usepackage[%
    paperwidth=540mm,
    paperheight=226mm,
    margin=0cm,
    noheadfoot,
]{geometry}

\makeatletter
    \edef\pwpt{\strip@pt\dimexpr0.996264009963\paperwidth\relax}
    \edef\phpt{\strip@pt\dimexpr0.996264009963\paperheight\relax}
\makeatother

%Alternative conversion using expl3:
\usepackage{xparse}
\ExplSyntaxOn
\NewExpandableDocumentCommand{\convert}{m}{%
    \fp_eval:n
    {
        round ( \dim_to_decimal_in_bp:n { #1 } , 3 )
    }
}
\ExplSyntaxOff

\edef\mypdfpageattr{
    /MediaBox[%
        0
        0
        \pwpt\space
        \phpt]^^J
    /MediaBox[%
        0
        0
        \convert{\paperwidth}\space
        \convert{\paperheight}]^^J
}
\expandafter\pdfpageattr\expandafter{\mypdfpageattr}

\begin{document}

These dimensions (at least the width) do not match the auto-generated MediaBox 
definition:

Paper width is \pwpt\ PS points ($\leftarrow$ differs from auto-generated 
MediaBox definition)

Paper height is \phpt\ PS points ($\leftarrow$ seems ok)

\bigskip

The following results do match the automatically added MediaBox (open pdf
file in text editor for details):

Paper width is \convert{\paperwidth}\ PS points ($\leftarrow$ seems better)

Paper height is \convert{\paperheight}\ PS points ($\leftarrow$ seems better)
\end{document}

注意:两个 MediaBox 定义/MediaBox[...向生成的 pdf 文件添加了第二条和第三条语句(在文本编辑器中打开 pdf 了解详情):不知道第一条语句的原因是什么,以及是否可以替换。

相关内容