![如何获取乳胶生成的文档中文本的相对位置](https://linux22.com/image/353161/%E5%A6%82%E4%BD%95%E8%8E%B7%E5%8F%96%E4%B9%B3%E8%83%B6%E7%94%9F%E6%88%90%E7%9A%84%E6%96%87%E6%A1%A3%E4%B8%AD%E6%96%87%E6%9C%AC%E7%9A%84%E7%9B%B8%E5%AF%B9%E4%BD%8D%E7%BD%AE.png)
我正在尝试编写一个自定义命令 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