我们使用 LaTeX 渲染 PDF,其中包含一个表格,该表格将由人工使用笔填写,然后输入到 OpenCV 应用程序进行识别。该表格由带有小方块(\fbox
符号)的问题组成,人们填写这些问题以回答是或否。
问题是,当我们能为识别算法提供一些提示,说明\fbox
es 的位置时,识别算法的效果会更好。因此,我们将它们排列成一个图案,与边框和边框之间保持一定的距离。但是,如果我们想要创建更复杂的布局,我们需要先渲染文档,然后查看 PDF 找出边距、分隔线等。
我们希望尽可能地自动化这个过程,所以一般的问题是:在 LaTeX 中“标记”某些符号的最佳方法是什么,以便我以后可以以某种方式恢复它们在呈现的 PDF 中的位置(我猜可能是使用第二个工具来查看 PDF 内部)?
答案1
使用
\fbox{%
\pdfsavepos\write-1{hello is at \the\pdflastxpos,\the\pdflastypos}%
hello%
}
日志文件将以缩放点的形式显示坐标
上述操作会在日志文件中产生如下一行:
hello is at 10005380,43282099
答案2
以下是通过 TikZ 可能的解决方案:
\documentclass{article}
\usepackage{tikz}
\usetikzlibrary{calc}
\newcommand\mybox{%
\begin{tikzpicture}[remember picture]
\draw (0,0) rectangle (.6em,.6em);
\path let \p1=($(.3em,.3em) - (current page.south west)$)
in \pgfextra{
\pgfmathsetmacro\xpos{\x1/1cm}
\pgfmathsetmacro\ypos{\y1/1cm}
\typeout{checkboxpos:(\xpos cm,\ypos cm)}
};
\end{tikzpicture}%
}
\begin{document}
This is a test \mybox{}.
\begin{itemize}
\item[\mybox{}] First item.
\begin{itemize}
\item[\mybox{}] First subitem.
\item[\mybox{}] Second subitem.
\item[\mybox{}] Third subitem.
\end{itemize}
\item[\mybox{}] Second item.
\item[\mybox{}] Third item.
\end{itemize}
\end{document}
经过两次编译后,你得到了这个日志:
复选框位置:(7.49284厘米,23.29828厘米) 复选框位置:(5.30951厘米,22.52507厘米) 复选框位置:(6.08272厘米,21.82214厘米) 复选框位置:(6.08272厘米,21.25981厘米) 复选框位置:(6.08272厘米,20.69748厘米) 复选框位置:(5.30951厘米,19.99455厘米) 复选框位置:(5.30951厘米,19.29164厘米)
答案3
此任务的重点是使用 pdfTeX 基元\pdfsavepos
、\pdflastxpos
、\pdflastypos
。您可以创建一个宏,以以下形式\saveposition
将实际位置保存到文件中:\jobname.pos
1: 67.65254mm, 267.37009mm
2: 101.77405mm, 267.37009mm
3: 67.65254mm, 261.73753mm
4: 101.77405mm, 261.73753mm
复选框的数字后面是 x 和 y 坐标。坐标系的 (0,0) 是纸张的左下角。您不需要两次 TeX 处理。此文件在第一次 TeX 运行后立即创建。
宏的实现\saveposition
可以如下:
\newcount\posnum
\newwrite\posout
\immediate\openout\posout=\jobname.pos
\def\saveposition{\global\advance\posnum by1 \pdfsavepos
\write\posout\expandafter{\the\posnum: \tomm\pdflastxpos, \tomm\pdflastypos}}
\def\tomm#1{\expandafter\ignorept\the\dimexpr.35146\dimexpr#1sp\relax\relax mm}
{\lccode`\?=`\p \lccode`\!=`\t \lowercase{\gdef\ignorept#1?!{#1}}}
sp
从到mm
单位的转换是通过\tomm
使用 eTeX 原语的宏完成的\dimexpr
。
现在测试一下。你需要把 放到\saveposition
你的\fbox
宏里。因为我不使用 LaTeX,所以我必须创建整个\fbox
:
\def\fbox{\leavevmode \saveposition
\lower3pt \hbox{\vrule \vbox{\hrule width1cm \kern.5cm \hrule}\vrule}%
}
aghd sajhas hds ddjds \fbox\ dhjdka ak das \fbox
aghd sajhas hds ddjds \fbox\ dhjdka ak das \fbox
\end
请注意,您不需要使用任何特殊包(如tikz
另一个答案中提到的)。