哪个内部 TeX 宏存储了 MediaBox 字符串,我如何读取它?

哪个内部 TeX 宏存储了 MediaBox 字符串,我如何读取它?

背景:所有 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,不会出现任何问题(根据 Adob​​e 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]

相关内容