隐藏文本,但保留可选择和可搜索的内容

隐藏文本,但保留可选择和可搜索的内容

继续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:

  1. 使用“文本渲染模式 3”(不要罢工不要充满) 作为字形形状。

  2. 在标准背景上对所有字符使用白色(或使用与背景相同的颜色为文本着色)。

  3. 使用标准文本颜色(黑色),但将其打印到黑色背景上。

这是我的第一个提案的 MWE。目前我不会为其他两个提案制作一个。下面展示了如何使用“文本渲染模式 3”将不可见(但可搜索)的文本写入 PDF 并“通过(或多或少纯粹的)LaTeX 命令来完成”

它利用了...

  1. ...该\pdfliteral命令通常允许将原始 PDF 代码插入 LaTeX 源,然后将其传递到由pdflatex(不是赛莱特或者路拉泰克斯(英文):
  2. ...PDF 代码片段3 Tr是 PDF 语法,用于将文本渲染模式设置为 3(表示“无描边和无填充”)。--*(qPDF 语法用于保存当前图形状态,而 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%,参见这里对于第一个方向。

在此处输入图片描述

相关内容