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
\eins
es 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, dasstitle
als zweites, obligatorisches Argument verwendet wird und der Standardwert1
als erstes, optionales Argument. Ich vermute, Sie meinen\eins[title]{\huge \textbf {Big Title}}
Andernfalls messen Sie die Tiefe,
title
die Null ergibt.In der Definition von
\eins
definieren 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
\dd
die Tiefe auf#2-ll
? Sollte das nicht die Tiefe des Pflichtarguments sein, also einfach nur von#2
? Die Zeichen-ll
haben keine Tiefe, beeinflussen also die Tiefe nicht, aber warum fügst du sie hinzu?Sie beginnen das Argument von
\write
mit#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
#2
die 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.pos
Nach dem Ausführen von pdflatex enthält die Datei
title: 8799518, 47171296, 4.03276pt
title2: 8799518, 45963106, 1.94444pt