假设我使用一个环境来排版一些文本,该环境将文本放在一个我指定宽度的框中。 (我不在乎这是一个小页面、表格还是其他什么。)我想将框的坐标写入文件。 (我可能会使用 xetex,因为这涉及希腊文本,而且在我尝试过的其他 tex 实现中这似乎太痛苦了。)在 pdftex 及其扩展(如 xetex)中,我可以\pdfsavepos
在文本的开头和结尾使用,并使用 write18 写入坐标。 但我认为这实际上不会给我框的左上角和右下角坐标的坐标。 我想它会记录基线(?)上第一个字符之前和最后一个字符之后一个点的位置。
有没有办法输出框的实际坐标,或者我必须通过基于框的宽度、字体的上升和下降高度以及可能的框/环境的边距进行算术来估算它?如果我必须自己做算术,是否有一些方便、自动化的方法来找出正在排版的字体的相关字体尺寸?
答案1
您可以将内容放在盒子寄存器中,然后访问其宽度、高度和深度以及位置\pdfsavepos
(这需要多次运行乳胶)
\documentclass{article}
\newsavebox\zzz
\makeatletter
\newcommand\usewithpos[2]{%
\ifcsname zz#1\endcsname\else
\expandafter\gdef\csname zz#1\endcsname{{}{}{}{}{}}%
\fi
\pdfsavepos
\protected@write\@auxout{}{%
\gdef\expandafter\string\csname zz#1\endcsname{%
{\noexpand\the\pdflastxpos}{\noexpand\the\pdflastypos}{\the\wd#2}{\the\ht#2}{\the\dp#2}}}%
\usebox{#2}}
\makeatother
\newcommand\boxdims[5]{%
\par
position (#1sp,#2sp)\par width #3, height #4, depth #5
}
\begin{document}
\savebox\zzz{\parbox{3cm}{one\\twooooo\\threeeeeeeee}}
A paragraph with no interest.
and here we use the box \fbox{\usewithpos{a}{\zzz}}
\savebox\zzz{\makebox[2cm]{x}}
and a second box \fbox{\usewithpos{b}{\zzz}}.
The first box is:
\expandafter\boxdims\zza.
The second box is:
\expandafter\boxdims\zzb.
\end{document}