如何取得LaTeX中的元素位置?

如何取得LaTeX中的元素位置?

我用 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)

如果您介意顯示的精度並喜歡對數字進行四捨五入,請查看\pgfmathprintnumberPGF/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}

在此輸入影像描述

相關內容