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
\eins
como 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 quetitle
se tomará como segundo argumento obligatorio y el valor predeterminado1
se usará como primer argumento opcional. Supongo que te refieres a\eins[title]{\huge \textbf {Big Title}}
De lo contrario se mide cuya profundidad
title
es cero.En la definición de
\eins
usted 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
\dd
la profundidad de#2-ll
? ¿No debería ser ésta la profundidad del argumento obligatorio, es decir, sólo de#2
? Los personajes-ll
no tienen profundidad, por lo que no influyen en la profundidad, pero ¿por qué los agregas?Comienzas el argumento de
\write
con#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
#2
a 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.pos
contiene
title: 8799518, 47171296, 4.03276pt
title2: 8799518, 45963106, 1.94444pt