背景:我编写了一个包,用于排版我创建的小图标,l3draw
我希望这些图标可以方便访问。更具体地说,当用户复制嵌入某些图标的文本时,图标的替换文本应该出现在剪贴板中。
我尝试了两种方法:
\hbox
在图标旁边添加重叠的透明文本;- 使用 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
到剪贴板。