我有一个使用 LaTeX 制作的复选框进行结果识别的测试閱讀。这工作正常,但如果我更改源框中的某些内容,它们将被重新定位,并且 queXF 识别框将变得无效。
是否可以将绝对框元素位置和大小输出到外部文件?
例如我有以下代码:
\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}
输出为:
我想要根据框的 ID 获取框的位置和大小信息(如果可能)。可能是这样的:
\Q1A{3cm}{2cm}{5mm}{5mm}
\Q2B{3cm}{2.5cm}{5mm}{5mm}
或者任何其他可以解析的格式。
任何想法都将不胜感激。
答案1
如果使用remember picture
选项,tikzpicture
图片来源将被写入辅助文件(.aux
)。使用的单位是缩放点 sp
即 65536sp = 1pt = 1/72.27inch。原点是 IIRC 左下角。您还可以将任何内容保存在框寄存器中,并将其大小写入辅助文件或其他文件。
更好的是,该zref-abspos
软件包允许您获取任何点的绝对位置,也可以在 中sp
。您需要在这些坐标处放置一个,然后使用和\zsavepos{<name>}
进行一次编译后即可获取坐标。手册指出,它仅适用于相对位置,因为没有官方参考原点,但在我所有的测试中,它也是左下角的页面。\zposx{<name>}
\zposy{<name>}
下面的代码可以证明这一点:
\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}
它会写入一个.pos
文件,其中包含如下位置:
Q1A: 9017948, 41890363, 9950287, 42822702
Q1B: 9017948, 40455628, 9950287, 41387967
Q1C: 9017948, 39020893, 9950287, 39953232
Q1D: 9017948, 37586158, 9950287, 38518497
还可以更改格式以获取pt
另一个单位的值,或者原点加上大小,而不是像现在这样获取左下角和右上角的绝对位置。
对于 mm 输出,将\write
内容替换为:
\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})%
}%
并添加以下宏:
\makeatletter
\newcommand\dimtomm[1]{%
\strip@pt\dimexpr 0.351459804\dimexpr#1\relax\relax mm%
}
\makeatother
然后你会得到:
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)
如果您介意显示的精度并且喜欢对数字进行四舍五入,请查看\pgfmathprintnumber
PGF/TikZ。但是,如果您无论如何解析这些文件,那么您也可以这样做。
如果您使用 DVI 模式(即latex
不是pdflatex
),则tikzpicture
使用由执行的 PostScript 代码创建dvips
后TeX 处理。在这种情况下,两个节点都尚未放置,并获取相同的坐标,该坐标应为图片的原点。相反,我只会保存一个点并测量图片的大小以获取另一个点。请注意,我添加了一些 PGF/TiKZ 代码以确保不会\zsavepos
影响图片的大小。
\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}
答案2
用于tikz
盒子完全是过度的......
\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}