라텍스로 제작된 문서에서 텍스트의 상대적 위치를 얻는 방법

라텍스로 제작된 문서에서 텍스트의 상대적 위치를 얻는 방법

나는 당신이 가지고 있을 때와 같은 사용자 정의 명령 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}}
    

    그렇지 않으면 깊이가 title0인 것을 측정합니다.

  • 정의에서 \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

관련 정보