So erhalten Sie die relative Position von Text in einem mit Latex erstellten Dokument

So erhalten Sie die relative Position von Text in einem mit Latex erstellten Dokument

Ich versuche, einen benutzerdefinierten Befehl eins zu schreiben, so dass, wenn Sie haben

\eins{id}{text}

, es gibt die relative Boxposition sowie die Tiefe und Höhe des Textes in mm (oder Punkten) innerhalb des gedruckten Dokuments zusammen mit einer Kennung aus, die mir sagt, welches Textelement sich an dieser Position befindet.

Bisher habe ich:

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

Wenn ich die Ausgabedatei angebe:

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

und ich füge später ein

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

Ich bekomme die Kennung und die x- und y-Positionen (relativ) des Textes Nr. 1 (überprüft durch Zeichnen an der gedruckten Position auf dem Bild...), aber die Tiefe wird nicht gedruckt

Ist das möglich? Die Antwort ist ja!

danke für die akzeptierte Antwort von @gernot. Ich lasse die ursprüngliche (verwirrende und verwirrende) Frage oben für den Kontext stehen, zeichne aber unten meine endgültige Implementierung für diejenigen auf, die genau das gleiche Problem haben:So erhalten Sie die geometrischen Grenzen des gerenderten Textes auf einer einzelnen PDF-Seite.

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

Antwort1

  • Sie definieren \einses als Befehl mit einem optionalen und einem obligatorischen Argument, da Sie angeben \newcommand{\eins}[2][1]. Sie verwenden es dann als \eins{title}, was bedeutet, dass titleals zweites, obligatorisches Argument verwendet wird und der Standardwert 1als erstes, optionales Argument. Ich vermute, Sie meinen

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

    Andernfalls messen Sie die Tiefe, titledie Null ergibt.

  • In der Definition von \einsdefinieren Sie eine neue Länge \dd. Verschieben Sie diese Anweisung aus der Definition von heraus \eins, da Sie sonst bei jedem Aufruf eine neue Länge verbrauchen \eins.

  • Warum stellst du \dddie Tiefe auf #2-ll? Sollte das nicht die Tiefe des Pflichtarguments sein, also einfach nur von #2? Die Zeichen -llhaben keine Tiefe, beeinflussen also die Tiefe nicht, aber warum fügst du sie hinzu?

  • Sie beginnen das Argument von \writemit #2. Wollen Sie wirklich das obligatorische Argument mit allen Formatierungsanweisungen schreiben (die erweitert werden und ein Durcheinander verursachen)? Ich nehme an, Sie möchten lieber das als optionales Argument bereitgestellte Label schreiben, also #1.

  • Möchten Sie das obligatorische Argument ausgeben oder nur messen? Im Moment wird es nicht in die Ausgabedatei geschrieben. Ich vermute, Sie möchten das Erste tun, also #2die Definition von ergänzen \eins, vielleicht am besten in der Nähe der Stelle, an der die Position gemessen wird.

  • Sie haben unzulässige Leerzeichen in der Definition von \eins, die in der Ausgabe als zusätzliches Leerzeichen erscheinen können. Fügen Sie am Ende der Zeilen Prozentzeichen hinzu.

Hier ist der korrigierte Code (ich habe die Konvertierung von pt in mm entfernt).

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

\jobname.72.280.posNach dem Ausführen von pdflatex enthält die Datei

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

verwandte Informationen