如何获取乳胶生成的文档中文本的相对位置

如何获取乳胶生成的文档中文本的相对位置

我正在尝试编写一个自定义命令 eins,这样当你有

\eins{id}{text}

,它会输出打印文档中文本的相对框位置以及以毫米(或点)为单位的深度和高度,以及一个告诉我哪个文本元素位于该位置的标识符。

到目前为止我已经:

\newcommand\dimtomm[1]{%
    \strip@pt\dimexpr 0.351459804\dimexpr#1\relax\relax %
}

\newcommand{\eins}[2][1]{%
    \zsavepos{#1-ll}
      \newlength{\dd}
      \settodepth{\dd}{#2-ll}
    \write\mywrite{#2: \dimtomm{\zposx{#1-ll}sp}, \dimtomm{\zposy{#1-ll}sp,  \the\dd, } }% 
}

如果我指定输出文件:

\newwrite\mywrite
\openout\mywrite=\jobname.72.280.pos \relax

然后我插入

\eins{title}{\huge \textbf {Big Title} }

它获取了文本 #1 的标识符以及 x 和 y 位置(相对)(通过在图像上的打印位置进行绘制来检查...)但它没有打印深度

能做到吗? 答案是肯定的!

感谢 @gernot 接受的答案。将上面的原始(令人困惑和困惑的)问题保留下来以供参考,但为那些有完全相同问题的人记录我的最终实现:如何获取单个 pdf 页面中渲染文本的几何边界

\makeatletter
\newcommand\dimtomm[1]{%
    \strip@pt\dimexpr 0.351459804\dimexpr#1\relax\relax %
}
\makeatother

\makeatletter
\def\convertto#1#2{\strip@pt\dimexpr #2*65536/\number\dimexpr 1#1}
\makeatother

\newwrite\mywrite
\immediate\openout\mywrite=\jobname.72.280.pos\relax

\newlength{\dd}
\newlength{\ww}
\newlength{\hh}
\newcommand{\eins}[2][1]%
   {\zsavepos{#1-ll}% Store the current position as #1-ll
    {#2}% Output the text provided as mandatory argument
    \settodepth{\dd}{#2}% Measure the depth of the mandatory argument
    \settowidth{\ww}{#2}% Measure the width of the mandatory argument
    \settoheight{\hh}{#2}% Measure the height of the mandatory argument
    \immediate\write\mywrite{#1: \dimtomm{\zposx{#1-ll}sp}, \dimtomm{\zposy{#1-ll}sp},  \convertto{mm}{\the\dd}, \convertto{mm}{\the\hh}, \convertto{mm}{\the\ww} }%
   }

\begin{document}
\eins[title]{\huge \textbf {Huge Title}}
\eins[title]{\Large \textbf {Large Title}}
\end{document}

答案1

  • \eins由于指定了,因此您将 定义为具有一个可选参数和一个强制参数的命令\newcommand{\eins}[2][1]。然后将其用作\eins{title},这意味着title将被视为第二个强制参数,默认值1将用作第一个可选参数。我猜你的意思是

    \eins[title]{\huge \textbf {Big Title}}
    

    否则,测量的深度title为零。

  • 在 的定义中\eins定义一个新的长度\dd。将此语句移出 的定义\eins,否则每次调用 时都会消耗一个新的长度\eins

  • 为什么要将\dd深度设置为#2-ll?这难道不应该是强制参数的深度吗#2?也就是说, ?字符-ll没有深度,所以它们不影响深度,但为什么要添加它们呢?

  • \write您以开始参数#2。您真的打算编写包含所有格式说明的强制参数吗(这将扩展并造成混乱)?我想您宁愿编写作为可选参数提供的标签,即#1

  • 您想输出强制参数还是仅测量它?目前它尚未写入输出文件。我猜您想做第一种,这意味着添加到#2的定义中\eins,也许最好靠近测量位置的地方。

  • 的定义中存在虚假空格\eins,这些空格可能会在输出中显示为多余的空格。请在行末添加百分号。

这是更正后的代码(我已删除 pt 到 mm 的转换)。

\documentclass{article}
\usepackage{zref-abspos}
\newwrite\mywrite
\immediate\openout\mywrite=\jobname.72.280.pos\relax
\newlength{\dd}
\newcommand{\eins}[2][1]%
   {\zsavepos{#1-ll}% Store the current position as #1-ll
    {#2}% Output the text provided as mandatory argument
    \settodepth{\dd}{#2}% Measure the depth of the mandatory argument
    \immediate\write\mywrite{#1: \zposx{#1-ll}, \zposy{#1-ll},  \the\dd}% 
   }

\begin{document}
\eins[title]{\huge \textbf {Big Title}}

\eins[title2]{\textbf {Not so big title}}
\end{document}

运行 pdflatex 后,文件\jobname.72.280.pos包含

title: 8799518, 47171296, 4.03276pt
title2: 8799518, 45963106, 1.94444pt

相关内容