LaTeX で要素の位置を取得するにはどうすればいいですか?

LaTeX で要素の位置を取得するにはどうすればいいですか?

私はLaTeXで作成されたチェックボックス付きのテストを結果認識のために持っていますqueXFこれは正常に動作しますが、ソースで何かを変更すると、ボックスが再配置され、queXF 認識ボックスが無効になります。

ボックス要素の絶対位置とサイズを外部ファイルに出力することは可能ですか?

たとえば、次のコードがあります。

\documentclass{article}
\usepackage{tikz}
\usetikzlibrary{calc}
\newcommand{\checkBox}[1]{
    \begin{tikzpicture}[color=black, line width=0.2mm]
        \draw (0,0) rectangle (5mm,5mm);
    \end{tikzpicture}
}
\begin{document}
    Question:\\
    \checkBox{Q1A}~Answer A\\
    \checkBox{Q1B}~Answer B\\
    \checkBox{Q1C}~Answer C\\
    \checkBox{Q1D}~Answer D\\
\end{document}

出力は次のとおりです。

ここに画像の説明を入力してください

そして、ボックスの位置とサイズに関する情報を(可能な場合)ID に従って取得したいと思います。おそらく次のようになります。

\Q1A{3cm}{2cm}{5mm}{5mm}
\Q2B{3cm}{2.5cm}{5mm}{5mm}

または解析可能な他の形式。

どのようなアイデアでも大歓迎です。

答え1

オプションを使用すると、画像remember pictureの原点が補助ファイル( )に書き込まれます。使用される単位はtikzpicture.auxスケールポイント spこれは 65536sp = 1pt = 1/72.27 インチです。原点は、IIRC のページの左下隅です。また、ボックス レジスタに任意のコンテンツを保存し、そのサイズを補助ファイルまたは別のファイルに書き込むこともできます。

zref-absposさらに良いのは、 内の任意の点の絶対位置を取得できるパッケージです。これらの座標に を配置し、 と を使用して 1 回のコンパイル後に座標を取得する必要spがあります。 マニュアルには、公式の参照原点がないため相対位置にのみ有効であると記載されていますが、私のすべてのテストでは、ページの左下隅でもありました。\zsavepos{<name>}\zposx{<name>}\zposy{<name>}

次のコードでこれを示します。

\documentclass{article}
\usepackage{zref-user}
\usepackage{zref-abspos}
\usepackage{tikz}
\usetikzlibrary{calc}
\newcommand{\checkBox}[1]{%
    \begin{tikzpicture}[color=black, line width=0.2mm]
        \draw (0,0)
            node {\zsavepos{#1-ll}}
            rectangle (5mm,5mm)
            node {\zsavepos{#1-ur}};
    \end{tikzpicture}%
    \write\mywrite{#1: \zposx{#1-ll}, \zposy{#1-ll}, \zposx{#1-ur}, \zposy{#1-ur}}%
}
\newwrite\mywrite
\openout\mywrite=\jobname.pos\relax
\begin{document}
    Question:\\
    \checkBox{Q1A}~Answer A\\
    \checkBox{Q1B}~Answer B\\
    \checkBox{Q1C}~Answer C\\
    \checkBox{Q1D}~Answer D\\
\end{document}

.pos次のような位置を保持するファイルを書き込みます。

Q1A: 9017948, 41890363, 9950287, 42822702
Q1B: 9017948, 40455628, 9950287, 41387967
Q1C: 9017948, 39020893, 9950287, 39953232
Q1D: 9017948, 37586158, 9950287, 38518497

ptフォーマットを変更して、現在のように左下隅と右上隅の絶対位置ではなく、別の単位で値を取得したり、原点とサイズを取得したりすることもできます。

mm 出力の場合は、\write内容を次のように置き換えます。

\write\mywrite{#1: (%
    \dimtomm{\zposx{#1-ll}sp},
    \dimtomm{\zposy{#1-ll}sp}) + (%
    \dimtomm{\zposx{#1-ur}sp-\zposx{#1-ll}sp},
    \dimtomm{\zposy{#1-ur}sp-\zposy{#1-ll}sp})%
}%

次のマクロを追加します。

\makeatletter
\newcommand\dimtomm[1]{%
    \strip@pt\dimexpr 0.351459804\dimexpr#1\relax\relax mm%
}
\makeatother

すると次のようになります:

Q1A: (48.36134mm, 224.64914mm) + (4.99992mm, 4.99992mm)
Q1B: (48.36134mm, 216.95496mm) + (4.99992mm, 4.99992mm)
Q1C: (48.36134mm, 209.26077mm) + (4.99992mm, 4.99992mm)
Q1D: (48.36134mm, 201.5666mm) + (4.99992mm, 4.99992mm)

表示される精度を気にして、代わりに数値を丸めたい場合は、\pgfmathprintnumberPGF/TikZ を参照してください。ただし、いずれにしてもこれらのファイルを解析する場合は、その方法でも実行できます。


latexDVIモード(つまり ではないpdflatex)を使用している場合、tikzpictureは、dvips TeX 処理。この場合、両方のノードはまだ配置されておらず、画像の原点となる同じ座標を取得します。代わりに、1 つのポイントのみを保存し、画像のサイズを測定してもう 1 つのポイントを取得します。\zsavepos画像のサイズに影響を与えないように、PGF/TiKZ コードをいくつか追加したことに注意してください。

\documentclass[a4paper]{article}
\usepackage{zref-user}
\usepackage{zref-abspos}
\usepackage{tikz}
\usetikzlibrary{calc}
\newsavebox\mybox
\newcommand{\checkBox}[1]{%
    \begingroup
    \sbox\mybox{%
        \begin{tikzpicture}[color=black, line width=0.2mm]
            % Pace the save pos "whatsit" without influencing the bounding box / size of the picture
            \begin{pgfinterruptboundingbox}
                \node at (0,0) {\zsavepos{#1-ll}};
            \end{pgfinterruptboundingbox}
            \draw (0,0) rectangle (5mm,5mm);
        \end{tikzpicture}%
    }%
    \usebox\mybox
    \immediate\write\mywrite{#1: (%
        \dimtomm{\zposx{#1-ll}sp},
        \dimtomm{\zposy{#1-ll}sp}) + (%
        \dimtomm{\wd\mybox},
        \dimtomm{\ht\mybox+\dp\mybox})%
    }%
    \endgroup
}
\makeatletter
\newcommand\dimtomm[1]{%
    \strip@pt\dimexpr 0.351459804\dimexpr#1\relax\relax mm%
}
\makeatother
\newwrite\mywrite
\immediate\openout\mywrite=\jobname.pos\relax
\begin{document}
    Question:\\
    \checkBox{Q1A}~Answer A\\
    \checkBox{Q1B}~Answer B\\
    \checkBox{Q1C}~Answer C\\
    \checkBox{Q1D}~Answer D\\
\end{document}

答え2

tikzボックスに使用するのは完全にやりすぎです...

\documentclass{article}
\usepackage{xcolor,zref-savepos}
\newcommand\checkBox[1]{\zsavepos{#1}{\fboxsep=0pt\fbox{\color{white}\rule{5mm}{5mm}}}}
\newdimen\DimX \newdimen\DimY
\makeatletter
\newcommand\getCM[1]{%
  \DimX=\zposx{#1}sp\relax \DimX=0.0347\DimX
  \DimY=\zposy{#1}sp\relax \DimY=0.0347\DimY
  \strip@pt\DimX:\strip@pt\DimY}
\makeatother

\begin{document}
    Question:\\
    \checkBox{Q1A}~Answer A\\
    \checkBox{Q1B}~Answer B\\
    \checkBox{Q1C}~Answer C\\
    \checkBox{Q1D}~Answer D

\bigskip\noindent
\getCM{Q1A}\\
\getCM{Q1B}\\
\getCM{Q1C}\\
\getCM{Q1D}

\end{document}

ここに画像の説明を入力してください

関連情報