나는 당신이 가지고 있을 때와 같은 사용자 정의 명령 eins를 작성하려고 합니다.
\eins{id}{text}
, 인쇄된 문서 내에서 상대적인 상자 위치와 텍스트의 깊이 및 높이(mm(또는 포인트))를 해당 위치에 있는 텍스트 요소를 알려주는 식별자와 함께 출력합니다.
지금까지 나는 다음을 가지고 있습니다 :
\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} }
텍스트 #1의 식별자와 x 및 y 위치(상대)를 가져오지만(이미지의 인쇄된 위치에 그려서 확인함...) 깊이는 인쇄되지 않습니다.
할 수 있나요? 대답은 '예'입니다!
@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]
. 그런 다음 이를 as 로 사용합니다\eins{title}
. 이는title
두 번째 필수 인수로 사용되며 기본값이1
첫 번째 선택적 인수로 사용됨을 의미합니다. 내 추측으로는 당신이 말하는 것 같아요\eins[title]{\huge \textbf {Big Title}}
그렇지 않으면 깊이가
title
0인 것을 측정합니다.정의에서
\eins
새로운 길이를 정의합니다\dd
. 이 문을 정의 밖으로 이동하세요\eins
. 그렇지 않으면 호출할 때마다 새 길이를 사용하게 됩니다\eins
.\dd
왜 깊이를 로 설정합니까#2-ll
? 이것이 필수 인수의 깊이, 즉 의 깊이여야 하지 않습니까#2
? 캐릭터에는-ll
깊이가 없어서 깊이에 영향을 주지 않는데 왜 추가하는 걸까요?\write
당신은 의 인수를 시작합니다#2
. 정말로 모든 형식 지정 지침(확장되어 혼란을 야기함)과 함께 필수 인수를 작성하시겠습니까? 나는 당신이 선택적 인수로 제공되는 레이블을 작성하고 싶다고 가정합니다#1
.필수 인수를 출력하시겠습니까, 아니면 측정만 하시겠습니까? 현재는 출력 파일에 기록되지 않습니다. 첫 번째 작업을 수행하고 싶은 것 같습니다. 이는
#2
의 정의에 추가하는 것을 의미합니다\eins
. 아마도 위치가 측정되는 장소 근처에 가장 적합할 것입니다.의 정의에 가짜 공백이 있는데
\eins
, 이는 출력에서 추가 공백으로 나타날 수 있습니다. 줄 끝에 백분율 기호를 추가합니다.
수정된 코드는 다음과 같습니다(pt에서 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}
pdflatex를 실행하면 파일에 다음이 \jobname.72.280.pos
포함됩니다.
title: 8799518, 47171296, 4.03276pt
title2: 8799518, 45963106, 1.94444pt