背景:所有 PDF 都有一个 MediaBox,用于描述每页的页面大小。在 PDF 中,它以文本字符串 /MediaBox [0 0 612 792](例如,美国信件)的形式出现,其中的数字表示“大点”。
根据页面尺寸,很容易计算出 MediaBox 应该是多少。MWE:
% Must work with pdflatex. Specifically pdflatex.
\documentclass[letterpaper]{memoir} % All pages same size.
\usepackage{pgf}
\newcommand{\whatTexUsesForMBwidth}{That is the width question!}
\newcommand{\whatTexUsesForMBheight}{That is the height question!}
% First is where the result is stored, second is the input.
% Input TeX pt, Result in bp to 0.1 no units.
\newcommand{\getbigpoints}[2]{
\pgfmathsetmacro#1{round(0.99626401*(#2+0.005))}
}
\newcommand\getMediaBoxWidth{
\getbigpoints{\myMBW}{\stockwidth}
}
\newcommand\getMediaBoxHeight{
\getbigpoints{\myMBH}{\stockheight}
}
\getMediaBoxWidth
\getMediaBoxHeight
\begin{document}
My calculated MediaBox width = \myMBW\par
My calculated MediaBox height = \myMBH\par
TeX internal MediaBox width = \whatTexUsesForMBwidth\par
TeX internal MediaBox height = \whatTexUsesForMBheight\par
\end{document}
输出:
My calculated MediaBox width = 612.0
My calculated MediaBox height = 792.0
TeX internal MediaBox width = That is the width question!
TeX internal MediaBox height = That is the height question!
现在,我可以在编辑器中检查 PDF,并直接读取 MediaBox。但我想做的是在 TeX 运行时学习 MediaBox 字符串,以便我可以在 TeX 文档中使用该字符串。
我为什么要这样做:出于合规性目的,我的文档需要 /TrimBox,在我的情况下就是 /MediaBox。我可以使用正确软件包的 TeX 计算值并将字符串写入 PDF,不会出现任何问题(根据 Adobe Acrobat Pro 9,这是有效的)。但那是因为我目前使用的是标准页面大小。如果我需要使用奇特的页面大小,则存在我的计算结果与 TeX 内部值相差一个点的风险。这可能会导致未检测到的错误。但是,如果我知道实际的 /MediaBox 字符串,我可以将其复制到 /TrimBox,而无需计算。
我已经设置了模拟着陆跑道并为货物祈祷,但没有结果。
答案1
我不确定你是否想将值四舍五入为整数,因为在 A4 纸的情况下,我们发现
/MediaBox[0 0 595.276 841.89]
但是,这取决于其默认值为 3 的设置\pdfdecimaldigits
。(感谢 Heiko Oberdiek 的提醒。)
要使用的参数是\pdfpagewidth
和\pdfpageheight
:
\documentclass[letterpaper]{memoir} % All pages same size.
\usepackage{xparse}
\ExplSyntaxOn
\NewDocumentCommand{\getMediaBox}{O{\MediaBox}}
{
\cs_gset:Npx #1
{
/MediaBox[0~0~
\robta_get_in_bp:n {\pdfpagewidth}~
\robta_get_in_bp:n {\pdfpageheight}]
}
}
\cs_new:Nn \robta_get_in_bp:n
{
\fp_eval:n
{
round ( \dim_to_decimal_in_bp:n { #1 } , \pdfdecimaldigits )
}
}
\ExplSyntaxOff
\begin{document}
\getMediaBox
\MediaBox
\end{document}
这是输出;\MediaBox
这样得到的是一个字符串,您可以以不同的方式使用它。如果您愿意,可以生成其他字符串。
这是 A4 纸的输出:
如果你\pdfdecimaldigits
在文档开头将其设置为 0,则
\pdfdecimaldigits=0
然后使用 A4 纸我们得到
/MediaBox[0 0 595 842]