Как получить относительное положение текста в документе, созданном с помощью латекса

Как получить относительное положение текста в документе, созданном с помощью латекса

Я пытаюсь написать пользовательскую команду 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} }

Он выводит мне идентификатор и координаты x и y (относительные) текста № 1 (проверено путем рисования в напечатанном положении на изображении...), но не выводит глубину.

Можно ли это сделать? Ответ – да!

спасибо за принятый ответ от @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, которые могут отображаться как лишние пробелы в выводе. Добавьте знаки процента в конце строк.

Вот исправленный код (я убрал преобразование пт в мм).

\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

Связанный контент