Wie erhält man die Elementposition in LaTeX?

Wie erhält man die Elementposition in LaTeX?

Ich habe einen Test mit Kontrollkästchen in LaTeX zur Ergebniserkennung inqueXF. Das funktioniert gut, aber wenn ich etwas an der Quelle ändere, werden die Felder verschoben und die queXF-Erkennungsfelder werden ungültig.

Ist es möglich, die absolute Position und Größe der Box-Elemente in einer externen Datei auszugeben?

Ich habe beispielsweise folgenden Code:

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

Die Ausgabe lautet:

Bildbeschreibung hier eingeben

Und ich möchte Informationen über die Positionen und Größen der Boxen (falls möglich) anhand ihrer IDs erhalten. Vielleicht so etwas wie das hier:

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

Oder in jedem anderen Format, das analysiert werden kann.

Alle Ideen sind sehr willkommen.

Antwort1

Wenn Sie die remember pictureOption verwenden tikzpicture, wird der Bildursprung in die Hilfsdatei geschrieben ( .aux). Die verwendete Einheit istskalierte Punkte spdas sind 65536sp = 1pt = 1/72,27 Zoll. Der Ursprung ist, wenn ich mich recht entsinne, die linke untere Seitenecke. Man kann jeden Inhalt auch in einem Boxregister speichern und seine Größe in die Hilfsdatei oder eine andere schreiben.

Noch besser ist das zref-absposPaket, mit dem Sie die absolute Position jedes beliebigen Punkts ermitteln können, auch in sp. Sie müssen \zsavepos{<name>}an diesen Koordinaten ein platzieren und können dann die Koordinaten nach einer Kompilierung mit \zposx{<name>}und ermitteln \zposy{<name>}. Im Handbuch steht, dass es nur für relative Positionen geeignet ist, da es keinen offiziellen Referenzursprung gibt, aber in allen meinen Tests war es auch die untere linke Seitenecke.

Der folgende Code soll dies demonstrieren:

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

Es wird eine .posDatei geschrieben, die die Positionen wie folgt enthält:

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

Das Format kann auch geändert werden, um die Werte in pteiner anderen Einheit oder dem Ursprung plus Größe anstelle der absoluten Position der unteren linken und oberen rechten Ecke wie jetzt zu erhalten.

Für die mm-Ausgabe ersetzen Sie den \writeInhalt durch:

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

und fügen Sie das folgende Makro hinzu:

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

Dann erhalten Sie:

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)

Wenn Sie die angezeigte Genauigkeit stört und die Zahlen lieber runden möchten, sehen Sie sich \pgfmathprintnumberPGF/TikZ an. Wenn Sie diese Dateien jedoch sowieso analysieren, können Sie dies auch dann tun.


Wenn Sie den DVI-Modus verwenden (also latexnicht pdflatex), tikzpicturewird die mit PostScript-Code erstellt, der ausgeführt wird vondvips nachdie TeX-Verarbeitung. In diesem Fall sind beide Knoten noch nicht platziert und erhalten die gleichen Koordinaten, die der Ursprung des Bildes sein sollten. Stattdessen würde ich nur einen Punkt speichern und die Größe des Bildes messen, um den anderen zu erhalten. Beachten Sie, dass ich etwas PGF/TiKZ-Code hinzugefügt habe, um sicherzustellen, dass dies \zsaveposdie Größe des Bildes nicht beeinflusst.

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

Antwort2

die Verwendung tikzfür die Boxen ist völlig übertrieben...

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

Bildbeschreibung hier eingeben

verwandte Informationen