¿Cómo obtener la posición del elemento en LaTeX?

¿Cómo obtener la posición del elemento en LaTeX?

Tengo una prueba con casillas de verificación realizadas en LaTeX para el reconocimiento de resultados enqueXF. Esto funciona bien, pero si cambio algo en los cuadros de origen, se reubican y los cuadros de reconocimiento de queXF dejan de ser válidos.

¿Es posible enviar la posición y los tamaños absolutos de los elementos del cuadro a un archivo externo?

Por ejemplo, tengo el siguiente código:

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

La salida es:

ingrese la descripción de la imagen aquí

Y quiero obtener información sobre las posiciones y tamaños de las cajas (si es posible) según sus ID. Quizás algo como esto:

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

O en cualquier otro formato que pueda analizarse.

Cualquier idea es muy apreciada.

Respuesta1

Si utiliza la remember pictureopción del tikzpictureorigen de la imagen se escribe en el archivo auxiliar ( .aux). La unidad utilizada espuntos escalados spque es 65536sp = 1pt = 1/72,27 pulgadas. El origen es IIRC en la esquina inferior izquierda de la página. También puedes guardar cualquier contenido en un registro de cuadro y escribir su tamaño en el archivo auxiliar u otro.

Aún mejor es el zref-abspospaquete que permite obtener la posición absoluta de cualquier punto, también en formato sp. Debe colocar a \zsavepos{<name>}en estas coordenadas y luego puede obtener las coordenadas después de una compilación usando \zposx{<name>}y \zposy{<name>}. El manual indica que solo es válido para posiciones relativas porque no hay un origen de referencia oficial, pero en todas mis pruebas también estaba en la esquina inferior izquierda de la página.

El siguiente código debería demostrar esto:

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

Escribe un .posarchivo que contiene posiciones como esta:

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

El formato también se puede cambiar para obtener los valores en ptotra unidad, o el origen más el tamaño en lugar de la posición absoluta de las esquinas inferior izquierda y superior derecha como es ahora.

Para salida en mm, reemplace el \writecontenido con:

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

y agregue la siguiente macro:

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

Entonces obtienes:

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)

Si le importa la precisión mostrada y le gusta redondear los números, eche un vistazo a \pgfmathprintnumberPGF/TikZ. Sin embargo, si analiza estos archivos de todos modos, también podrá hacerlo.


Si está utilizando el modo DVI (es decir, latexno pdflatex), el tikzpicturese crea utilizando código PostScript ejecutado pordvips despuésel procesamiento TeX. En este caso ambos nodos aún no están colocados y obtienen las mismas coordenadas que deberían ser el origen de la imagen. En lugar de eso, solo guardaría un punto y mediría el tamaño de la imagen para obtener el otro. Tenga en cuenta que agregué algo de código PGF/TiKZ para asegurarme de que \zsaveposno influya en el tamaño de la imagen.

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

Respuesta2

Usar tikzpara las cajas es totalmente excesivo...

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

ingrese la descripción de la imagen aquí

información relacionada