Como obter a posição relativa do texto em um documento produzido em látex

Como obter a posição relativa do texto em um documento produzido em látex

Estou tentando escrever um comando personalizado de forma que quando você tiver

\eins{id}{text}

, ele gera a posição relativa da caixa e a profundidade e altura do texto em mm (ou pontos) no documento impresso junto com um identificador que informa qual elemento de texto está naquela posição.

Até agora eu tenho:

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

Se eu especificar o arquivo de saída:

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

e depois insiro

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

Ele me dá o identificador e as posições x e y (relativas) do texto #1 (verificado pelo desenho na posição impressa na imagem...) mas não imprime a profundidade

Isso pode ser feito? a resposta é sim!

obrigado pela resposta aceita de @gernot. Deixando a pergunta original (confusa e confusa) acima para contextualizar, mas registrando minha implementação final abaixo para aqueles com exatamente o mesmo problema:como obter os limites geométricos do texto renderizado em uma única 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}

Responder1

  • Você define \einscomo um comando com um argumento opcional e um argumento obrigatório, desde que você especifique \newcommand{\eins}[2][1]. Em seguida, você o usa como \eins{title}, o que significa que titleserá considerado o segundo argumento obrigatório e o valor padrão 1será usado como o primeiro argumento opcional. Meu palpite é que você quer dizer

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

    Caso contrário, você mede a profundidade titleque é zero.

  • Na definição de \einsvocê define um novo comprimento \dd. Retire esta instrução da definição de \eins, caso contrário você consumirá um novo comprimento cada vez que invocar \eins.

  • Por que você definiu \dda profundidade de #2-ll? Não deveria ser esta a profundidade do argumento obrigatório, ou seja, apenas de #2? Os personagens -llnão têm profundidade, então não influenciam a profundidade, mas por que você os adiciona?

  • Você começa o argumento \writecom #2. Você realmente pretende escrever o argumento obrigatório com todas as instruções de formatação (que serão ampliadas e darão uma bagunça)? Suponho que você queira escrever o rótulo fornecido como argumento opcional, que é #1.

  • Você deseja gerar o argumento obrigatório ou apenas medi-lo? No momento não está gravado no arquivo de saída. Eu acho que você quer fazer o primeiro, o que significa adicionar #2à definição de \eins, talvez melhor perto do local onde a posição é medida.

  • Você tem espaços espúrios na definição de \eins, que podem aparecer como espaço extra na saída. Adicione sinais de porcentagem no final das linhas.

Aqui está o código corrigido (removi a conversão de pt para 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}

Depois de executar o pdflatex, o arquivo \jobname.72.280.poscontém

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

informação relacionada