可靠地提供可复制的替代文本进行绘图,同时保留空格

可靠地提供可复制的替代文本进行绘图,同时保留空格

背景:我编写了一个包,用于排版我创建的小图标,l3draw我希望这些图标可以方便访问。更具体地说,当用户复制嵌入某些图标的文本时,图标的替换文本应该出现在剪贴板中。

我尝试了两种方法:

  1. \hbox在图标旁边添加重叠的透明文本;
  2. 使用 PDF 标记添加\ActualText到 PDF 中。

1) 的问题在于我无法可靠地控制空格和输出,并且使用透明文本的构造也感觉有点不合适。使用 PDFLaTeX 编译后,我从复制以下 MWE 的输出中得到的结果是Foo descrbipatzion

\documentclass{article}
\usepackage{l3draw}

\ExplSyntaxOn

    \NewDocumentCommand{\myicon}{ }{
        \group_begin:
            \hspace { 0.05em }
            \hbox_overlap_right:n { \color_select:n { .!0 } description }
            \draw_begin:
                \draw_path_circle:nn { 0 , 0 } { 10pt }
                \draw_path_use_clear:n { fill } 
            \draw_end:
            \hspace { 0.05em }
        \group_end:
    }

\ExplSyntaxOff

\begin{document}

    Foo \myicon baz

\end{document} 

因此,我可能会选择 2)。但是,这里的问题是,我发现很难使图标可选择,以便\ActualText甚至可以复制。我发现\pdffakespace在搜索此站点以查找类似问题时,在 MWE 下编译时,复制的文本是正确的。但考虑到我将 Expl3 与其他命令结合使用,我想知道这是否真的是最好的解决方案。

\DocumentMetadata{}
\documentclass{article}
\usepackage{l3draw}

\ExplSyntaxOn

\NewDocumentCommand{\myicon}{ }{
    \group_begin:
        \hspace { 0.05em }
        \pdf_bdc:nn { Span } { /ActualText ~ ( ~ description ~ ) }
        \hbox_overlap_right:n { \pdffakespace }
        \draw_begin:
            \draw_path_circle:nn { 0 , 0 } { 10pt }
            \draw_path_use_clear:n { fill } 
        \draw_end:
        \pdf_emc:
        \hspace { 0.05em }
    \group_end:
}

\ExplSyntaxOff

\begin{document}
    
    Foo \myicon baz
    
\end{document} 

答案1

好吧,你现在只能听天由命了。他们决定是否复制和粘贴(并且有各种启发式方法,这使得很难找到一个始终有效的解决方案)。

我不会/ActualText将其用于较长的文本,通常它用于替换一个符号。此外,并非所有查看器都支持它,并且(正如您所发现的)有时支持它的查看器也会忽略它。

我也不想使用它,\pdffakespace因为它不受所有引擎支持(tagpdf 包含 luatex 的重新实现,但没有 xetex 的重新实现)。

相反,我只需用小字体打印一些内容到某些填充区域的背景中:

\documentclass{article}
\usepackage{l3draw}

\ExplSyntaxOn

\NewDocumentCommand{\myicon}{ }{
    \group_begin:
        \hspace { 0.05em }              
        \box_move_up:nn{5pt}{\hbox_overlap_right:n { ~\tiny icon }}  
        \draw_begin:
            \draw_path_circle:nn { 0 , 0 } { 10pt }
            \draw_path_use_clear:n { fill } 
        \draw_end:        
        \hspace { 0.05em }
    \group_end:
}

\ExplSyntaxOff

\begin{document}
 
    Foo \myicon baz
\end{document} 

答案2

我刚刚发现我也可以使用 abox或 acoffin来保存可以剪掉的描述。所以,这实际上是对 Ulrike 的精彩回答的后续。

正如 Ulrike 所说,是否添加空格显然由 PDF 查看器决定。至少在 Acrobat 中,我发现如果两个容纳文本的框之间有足够的空间,则会添加空格,但如果空间太窄(甚至为负数),则不会在复制的字符串中添加空格。

通过正确调整棺材的尺寸,空间问题也可以得到解决:

\documentclass{article}
\usepackage{l3draw}

\ExplSyntaxOn

    \NewDocumentCommand{\myicon}{ }{
        \group_begin:
            \hspace { 0.05em }
            \draw_begin:
                \draw_scope_begin:
                    \draw_path_rectangle_corners:nn { -10pt , 20pt } { 10pt , 20pt }
                    \draw_path_use_clear:n { clip }  
                    \hcoffin_set:Nn \l_tmpa_coffin { description }
                    \coffin_resize:Nnn \l_tmpa_coffin { 15pt } { 20pt }
                    \draw_coffin_use:Nnnn \l_tmpa_coffin { hc } { vc } { 0pt , 0pt }
                \draw_scope_end:
                \draw_path_circle:nn { 0 , 0 } { 10pt }
                \draw_path_use_clear:n { fill } 
            \draw_end:
            \hspace { 0.05em } 
        \group_end:
    }

\ExplSyntaxOff  

\begin{document}

    Foo \myicon baz 

\end{document} 

这将复制Foo description baz到剪贴板。

相关内容