我正在嘗試編寫一個自訂命令,以便當您有
\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