Cómo obtener la posición relativa del texto en un documento producido en látex

Cómo obtener la posición relativa del texto en un documento producido en látex

Estoy intentando escribir un comando personalizado eins de modo que cuando tengas

\eins{id}{text}

, genera la posición relativa del cuadro y la profundidad y altura del texto en mm (o puntos) dentro del documento impreso junto con un identificador que me indica qué elemento de texto está en esa posición.

Hasta ahora tengo:

\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, } }% 
}

Si especifico el archivo de salida:

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

y luego inserto

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

Me da el identificador y las posiciones x e y (relativas) del texto #1 (comprobado dibujando en la posición impresa en la imagen...) pero no imprime la profundidad.

Se puede hacer? ¡la respuesta es sí!

gracias a la respuesta aceptada de @gernot. Dejando la pregunta original (confusa y confusa) anterior para el contexto, pero registrando mi implementación final a continuación para aquellos con exactamente el mismo problema:cómo obtener los límites geométricos del texto renderizado en una sola página 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}

Respuesta1

  • Lo defines \einscomo un comando con un argumento opcional y uno obligatorio, ya que especificas \newcommand{\eins}[2][1]. Luego lo usa como \eins{title}, lo que significa que titlese tomará como segundo argumento obligatorio y el valor predeterminado 1se usará como primer argumento opcional. Supongo que te refieres a

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

    De lo contrario se mide cuya profundidad titlees cero.

  • En la definición de \einsusted define una nueva longitud \dd. Saque esta declaración de la definición de \eins, de lo contrario consumirá una nueva longitud cada vez que invoque \eins.

  • ¿Por qué establecer \ddla profundidad de #2-ll? ¿No debería ser ésta la profundidad del argumento obligatorio, es decir, sólo de #2? Los personajes -llno tienen profundidad, por lo que no influyen en la profundidad, pero ¿por qué los agregas?

  • Comienzas el argumento de \writecon #2. ¿Realmente tiene la intención de escribir el argumento obligatorio con todas las instrucciones de formato (que se ampliarán y ensuciarán)? Supongo que prefieres escribir la etiqueta proporcionada como argumento opcional, que es #1.

  • ¿Quiere generar el argumento obligatorio o simplemente medirlo? Por el momento no está escrito en el archivo de salida. Supongo que quieres hacer lo primero, lo que significa agregar #2a la definición de \eins, quizás mejor cerca del lugar donde se mide la posición.

  • Tiene espacios falsos en la definición de \eins, que pueden aparecer como espacio adicional en el resultado. Agrega signos de porcentaje al final de las líneas.

Aquí está el código corregido (he eliminado la conversión de pt a 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}

Después de ejecutar pdflatex, el archivo \jobname.72.280.poscontiene

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

información relacionada