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
\eins
como 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 quetitle
será considerado o segundo argumento obrigatório e o valor padrão1
será 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
title
que é zero.Na definição de
\eins
você 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
\dd
a profundidade de#2-ll
? Não deveria ser esta a profundidade do argumento obrigatório, ou seja, apenas de#2
? Os personagens-ll
não têm profundidade, então não influenciam a profundidade, mas por que você os adiciona?Você começa o argumento
\write
com#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.pos
contém
title: 8799518, 47171296, 4.03276pt
title2: 8799518, 45963106, 1.94444pt