
Tenho um teste com check boxes feitos em LaTeX para reconhecimento de resultados emqueXF. Isso funciona bem, mas se eu mudar algo nas caixas de origem, elas serão realocadas e as caixas de reconhecimento queXF se tornarão inválidas.
É possível fazer a saída da posição e dos tamanhos absolutos dos elementos da caixa para um arquivo externo?
Por exemplo, tenho o seguinte 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}
A saída é:
E quero obter informações sobre posições e tamanhos de caixas (se possível) de acordo com seus IDs. Talvez algo assim:
\Q1A{3cm}{2cm}{5mm}{5mm}
\Q2B{3cm}{2.5cm}{5mm}{5mm}
Ou em qualquer outro formato que possa ser analisado.
Qualquer ideia é muito apreciada.
Responder1
Se usar a remember picture
opção tikzpicture
a origem da imagem é gravada no arquivo auxiliar (.aux
). A unidade utilizada épontos escalados sp
que é 65536sp = 1pt = 1/72,27 polegadas. A origem é IIRC, no canto inferior esquerdo da página. Você também pode salvar qualquer conteúdo em um caixa registrador e escrever seu tamanho em um arquivo auxiliar ou outro.
Melhor ainda é o zref-abspos
pacote que permite obter a posição absoluta de qualquer ponto, também em formato sp
. Você precisa colocar a \zsavepos{<name>}
nessas coordenadas e então obter as coordenadas após uma compilação usando \zposx{<name>}
e \zposy{<name>}
. O manual afirma que só serve para posições relativas porque não existe uma origem de referência oficial, mas em todos os meus testes também foi o canto inferior esquerdo da página.
O código a seguir deve demonstrar isso:
\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}
Ele grava um .pos
arquivo que contém as posições como esta:
Q1A: 9017948, 41890363, 9950287, 42822702
Q1B: 9017948, 40455628, 9950287, 41387967
Q1C: 9017948, 39020893, 9950287, 39953232
Q1D: 9017948, 37586158, 9950287, 38518497
O formato também pode ser alterado para obter os valores em pt
outra unidade, ou a origem mais tamanho em vez da posição absoluta do canto inferior esquerdo e superior direito como é agora.
Para saída mm substitua o \write
conteúdo por:
\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})%
}%
e adicione a seguinte macro:
\makeatletter
\newcommand\dimtomm[1]{%
\strip@pt\dimexpr 0.351459804\dimexpr#1\relax\relax mm%
}
\makeatother
Então você obtém:
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)
Se você se importa com a precisão mostrada e gosta de arredondar os números, dê uma olhada em \pgfmathprintnumber
PGF/TikZ. No entanto, se você analisar esses arquivos de qualquer maneira, também poderá fazê-lo.
Se você estiver usando o modo DVI (ou seja, latex
não pdflatex
), o arquivo tikzpicture
será criado usando código PostScript executado pordvips
depoiso processamento TeX. Neste caso ambos os nós ainda não estão posicionados e obtêm as mesmas coordenadas que deveriam ser a origem da imagem. Em vez disso, salvaria apenas um ponto e mediria o tamanho da imagem para obter o outro. Observe que adicionei algum código PGF/TiKZ para garantir que isso \zsavepos
não influencie o tamanho da imagem.
\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}
Responder2
usar tikz
para as caixas é um exagero...
\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}