LaTeX で作成されたドキュメント内のテキストの相対位置を取得する方法

LaTeX で作成されたドキュメント内のテキストの相対位置を取得する方法

私はカスタムコマンド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を指定しているので、 はオプション引数と必須引数を 1 つずつ持つコマンドとして定義されます\newcommand{\eins}[2][1]。次に として使用します。つまり\eins{title}、 はtitle2 番目の必須引数として使用され、デフォルト値は11 番目のオプション引数として使用されます。私の推測では、

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

    それ以外の場合は、深さはtitleゼロとして測定されます。

  • の定義で、\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

関連情報