
결과 인식을 위해 LaTeX로 만든 확인란을 사용하여 테스트했습니다.queXF. 이것은 잘 작동하지만 소스 상자의 내용을 변경하면 재배치되고 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
. 이 좌표에 를 배치해야 하며 and 를 \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를 살펴보세요 . 그러나 어쨌든 이러한 파일을 구문 분석하면 그렇게 할 수도 있습니다.
latex
DVI 모드(예: 아님 pdflatex
) 를 사용하는 경우 는 tikzpicture
다음에서 실행되는 PostScript 코드를 사용하여 생성됩니다.dvips
~ 후에TeX 처리. 이 경우 두 노드는 아직 배치되지 않았으며 그림의 원점이 되어야 하는 동일한 좌표를 얻습니다. 대신 한 지점만 저장하고 사진의 크기를 측정하여 다른 지점을 얻습니다. \zsavepos
그림 크기에 영향을 주지 않도록 PGF/TiKZ 코드를 추가했습니다 .
\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}