
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:
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 picture
opción del tikzpicture
origen de la imagen se escribe en el archivo auxiliar ( .aux
). La unidad utilizada espuntos escalados sp
que 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-abspos
paquete 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 .pos
archivo 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 pt
otra 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 \write
contenido 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 \pgfmathprintnumber
PGF/TikZ. Sin embargo, si analiza estos archivos de todos modos, también podrá hacerlo.
Si está utilizando el modo DVI (es decir, latex
no pdflatex
), el tikzpicture
se 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 \zsavepos
no 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 tikz
para 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}