
我用 LaTeX 製作的複選框進行了測試,以進行結果識別闕XF。這工作正常,但如果我更改來源框中的某些內容,則會重新定位,並且 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
.您需要在這些座標處放置 a ,然後可以使用和\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}