Como obter a posição do elemento no LaTeX?

Como obter a posição do elemento no LaTeX?

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 é:

insira a descrição da imagem aqui

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 pictureopção tikzpicturea origem da imagem é gravada no arquivo auxiliar (.aux ). A unidade utilizada épontos escalados spque é 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-abspospacote 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 .posarquivo 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 ptoutra 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 \writeconteú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 \pgfmathprintnumberPGF/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, latexnão pdflatex), o arquivo tikzpictureserá 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 \zsaveposnã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 tikzpara 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}

insira a descrição da imagem aqui

informação relacionada