Я пытаюсь написать пользовательскую команду eins, такую, что когда у вас есть
\eins{id}{text}
, он выводит относительное положение рамки, а также глубину и высоту текста в мм (или пунктах) в напечатанном документе вместе с идентификатором, который сообщает мне, какой текстовый элемент находится в этой позиции.
На данный момент я:
\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, } }%
}
Если я укажу выходной файл:
\newwrite\mywrite
\openout\mywrite=\jobname.72.280.pos \relax
и позже я вставлю
\eins{title}{\huge \textbf {Big Title} }
Он выводит мне идентификатор и координаты x и y (относительные) текста № 1 (проверено путем рисования в напечатанном положении на изображении...), но не выводит глубину.
Можно ли это сделать? Ответ – да!
спасибо за принятый ответ от @gernot. Оставляю исходный (запутанный и сбивающий с толку) вопрос выше для контекста, но записываю свою окончательную реализацию ниже для тех, у кого точно такая же проблема:как получить геометрические границы отображаемого текста на одной странице 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}
решение1
Вы определяете
\eins
, чтобы быть командой с одним необязательным и одним обязательным аргументом, так как вы указываете\newcommand{\eins}[2][1]
. Затем вы используете его как\eins{title}
, что означает, чтоtitle
будет принято как второй обязательный аргумент, а значение по умолчанию1
будет использовано как первый необязательный аргумент. Я предполагаю, что вы имеете в виду\eins[title]{\huge \textbf {Big Title}}
В противном случае вы измеряете глубину,
title
равную нулю.В определении
\eins
вы определяете новую длину\dd
. Переместите этот оператор из определения\eins
, иначе вы потребляете новую длину каждый раз, когда вызываете\eins
.Почему вы устанавливаете
\dd
на глубину#2-ll
? Разве это не должно быть глубиной обязательного аргумента, т. е. просто#2
? У символов-ll
нет глубины, поэтому они не влияют на глубину, но зачем вы их добавляете?Вы начинаете аргумент
\write
с#2
. Вы действительно собираетесь написать обязательный аргумент со всеми инструкциями по форматированию (которые будут расширены и создадут беспорядок)? Я полагаю, вы скорее хотите написать метку, предоставленную как необязательный аргумент, то есть#1
.Вы хотите вывести обязательный аргумент или просто измерить его? На данный момент он не записан в выходной файл. Я полагаю, вы хотите сделать первое, что означает добавить
#2
к определению\eins
, возможно, лучше всего рядом с местом, где измеряется положение.У вас есть ложные пробелы в определении
\eins
, которые могут отображаться как лишние пробелы в выводе. Добавьте знаки процента в конце строк.
Вот исправленный код (я убрал преобразование пт в мм).
\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}
После запуска pdflatex файл \jobname.72.280.pos
содержит
title: 8799518, 47171296, 4.03276pt
title2: 8799518, 45963106, 1.94444pt