继续https://tex.stackexchange.com/a/463516,有没有办法创建与绘制符号相关联的不可见 PDF 文本?假设我们有一些命令(例如\sqp
),它会绘制一些符号,但在 PDF 中不会产生可搜索/可选择的文本。我们希望将绘制符号的这种文本表示(例如,Π
既不显示也不打印)添加到 PDF 文件中,以便可以选择和搜索它。这种文本的一个例子是,例如,包含的 PDF 图像包含不可见但可选择的文本. 重用@egreg的代码https://tex.stackexchange.com/a/463516/165772(谢谢!)我试过了
\documentclass{article}
\usepackage{amsmath}
\usepackage{xparse}
\usepackage{accsupp}
\ExplSyntaxOn
\NewDocumentCommand{\sqp}{s}
{
\IfBooleanTF{#1}
{
\mathord { \mathpalette \egreg_sqp:Nn { \mathrm{o} } }
}
{
\mathord {
\mathpalette \egreg_sqp:Nn { }
}
}
}
\box_new:N \l__egreg_sqp_temp_box
\dim_new:N \l__egreg_sqp_wd_dim % width
\dim_new:N \l__egreg_sqp_ht_dim % height
\dim_new:N \l__egreg_sqp_th_dim % thickness
\cs_new_protected:Nn \egreg_sqp:Nn
{% #1 = style declaration, #2 = maybe o
\group_begin:
\dim_zero:N \mathsurround
\hbox_set:Nn \l__egreg_sqp_temp_box { $#1\mathrm{o}$ }
\dim_set:Nn \l__egreg_sqp_wd_dim { \box_wd:N \l__egreg_sqp_temp_box }
\dim_set:Nn \l__egreg_sqp_th_dim { \box_wd:N \l__egreg_sqp_temp_box/4 }
\hbox_set:Nn \l__egreg_sqp_temp_box { $#1\Pi$ }
\dim_set:Nn \l__egreg_sqp_ht_dim { \box_ht:N \l__egreg_sqp_temp_box }
\mspace{1mu}
\tl_if_empty:nF { #2 }
{
\hbox_to_zero:n
{
\hbox_to_wd:nn { \l__egreg_sqp_wd_dim + 2\l__egreg_sqp_th_dim } { \hss $#1#2$ \hss }
\hss
}
}
\hbox_to_wd:nn { \l__egreg_sqp_wd_dim + 2\l__egreg_sqp_th_dim } { \__egreg_sqp_draw:N #1 \hss }
\mspace{1mu}
\group_end:
}
\cs_new_protected:Nn \__egreg_sqp_draw:N
{
\driver_draw_begin:
\driver_draw_moveto:nn { 0pt } { 0pt }
\driver_draw_lineto:nn { 0pt } { \l__egreg_sqp_ht_dim }
\driver_draw_lineto:nn { \l__egreg_sqp_wd_dim + 2\l__egreg_sqp_th_dim } { \l__egreg_sqp_ht_dim }
\driver_draw_lineto:nn { \l__egreg_sqp_wd_dim + 2\l__egreg_sqp_th_dim } { 0pt }
\driver_draw_lineto:nn { \l__egreg_sqp_wd_dim + \l__egreg_sqp_th_dim } { 0pt }
\driver_draw_lineto:nn { \l__egreg_sqp_wd_dim + \l__egreg_sqp_th_dim } { \l__egreg_sqp_ht_dim - 0.7\l__egreg_sqp_th_dim }
\driver_draw_lineto:nn { \l__egreg_sqp_th_dim } { \l__egreg_sqp_ht_dim - 0.7\l__egreg_sqp_th_dim }
\driver_draw_lineto:nn { \l__egreg_sqp_th_dim } { 0pt }
\driver_draw_closepath:
\driver_draw_fill:
\driver_draw_end:
}
\ExplSyntaxOff
\begin{document}
\BeginAccSupp{method=hex,unicode,ActualText=03A0}$\sqp$\EndAccSupp{}
\end{document}
在文本层中,这不会产生Π
(正如我所期望的那样),而只会1
产生文档结尾。(与基于 accsup 的解决方案相反,基于 ocg 的解决方案可能需要在每次使用符号时使用新的 id;我不知道如何自动生成它,而且它似乎不会产生可选择的文本。无论如何,我还没有尝试过。)
我更喜欢一个适用于所有三个引擎{pdf|xe|lua}latex的解决方案,即使必须使用条件\if...
。正如@Raven所注意到的,将背景设为白色是可行的(除非您再次用其他东西(例如图像)覆盖符号)——当我没有选择时,我会这样做。
答案1
在我对 OP/问题的评论中,我提出了三种不同的方法将文本写入不可见但仍可选择和可搜索的 PDF:
使用“文本渲染模式 3”(不要罢工不要充满) 作为字形形状。
在标准背景上对所有字符使用白色(或使用与背景相同的颜色为文本着色)。
使用标准文本颜色(黑色),但将其打印到黑色背景上。
这是我的第一个提案的 MWE。目前我不会为其他两个提案制作一个。下面展示了如何使用“文本渲染模式 3”将不可见(但可搜索)的文本写入 PDF 并“通过(或多或少纯粹的)LaTeX 命令来完成”。
它利用了...
- ...该
\pdfliteral
命令通常允许将原始 PDF 代码插入 LaTeX 源,然后将其传递到由pdflatex(不是赛莱特或者路拉泰克斯(英文): - ...PDF 代码片段
3 Tr
是 PDF 语法,用于将文本渲染模式设置为 3(表示“无描边和无填充”)。--*(q
PDF 语法用于保存当前图形状态,而 PDF 语法Q
用于将其恢复到以前的文本渲染模式)。**
以下是 MWE:
\documentclass{文章} \开始{文档} 这是我的正常文本。\\ \makebox[50pt][c]{\pdfliteral page{q 3 Tr}这是隐藏的(但可搜索)文本。\pdfliteral page{Q}} \\这是更正常的文本。\\ \结束{文档}
将其编译为 PDF:。pdflatex my.tex
在任何查看器中打开 PDF 并选择全部(尝试点击ctrl+a
(Windows、Linux)或cmd+a
(苹果系统)):
如您所见,两个可读的句子之间有突出显示但看不见的内容。要找出它是什么,...
- ...要么跑
pdftotext -layout my.pdf -
, - ...或搜索字符串“这是隐藏的(但可搜索的)文本。”
答案2
该软件包pdfrender
使实现这一点变得容易。该代码适用于 PdfLaTeX 和 LuaLatex,但不适用于 XeLaTeX。它的工作原理与其他答案相同,但兼容性更高,级别更低。
\documentclass{article}
\usepackage{pdfrender}
\begin{document}
\noindent
This is my normal text.\\
\textpdfrender{TextRenderingMode=Invisible}{This text is invisible}\\
This is more normal text.\\
\end{document}
XeLaTeX 的解决方案可能是使用fadings
带有库的 TikZ 并设置输入文本的透明度和矩形也为 0%,参见这里对于第一个方向。