如何取得乳膠產生的文件中文字的相對位置

如何取得乳膠產生的文件中文字的相對位置

我正在嘗試編寫一個自訂命令,以便當您有

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

它為我提供了文字 #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]。然後將其用作\eins{title},這意味著 它將title被視為第二個強制參數,而預設值1將用作第一個可選參數。我的猜測是你的意思是

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

    否則,您測量的深度title為零。

  • 在定義中\eins定義一個新的 length \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

相關內容