
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:
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 picture
Option verwenden tikzpicture
, wird der Bildursprung in die Hilfsdatei geschrieben ( .aux
). Die verwendete Einheit istskalierte Punkte sp
das 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-abspos
Paket, 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 .pos
Datei 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 pt
einer 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 \write
Inhalt 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 \pgfmathprintnumber
PGF/TikZ an. Wenn Sie diese Dateien jedoch sowieso analysieren, können Sie dies auch dann tun.
Wenn Sie den DVI-Modus verwenden (also latex
nicht pdflatex
), tikzpicture
wird 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 \zsavepos
die 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 tikz
fü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}