soul
我使用/提供的字母间距soulutf8
来强调单词。但是
如果我尝试从 pdf 文件中复制一个有空格的单词,那么我得到的是“wor d”而不是“word”。
另外,在 pdf 文件中搜索“单词”不会返回带空格的单词。
有没有什么技巧可以解决这个问题?
答案1
您已经找到了令人满意的解决方案,方法是(1)使用accsupp
并(2)减少跟踪(=词内间距)从 0.25em(\textso
默认值)大幅缩减至 0.1em。(根据我的经验,仅使用 (2) 号即可解决大多数 PDF 阅读器的搜索和复制问题。)
此外,我建议放弃soul(utf8)
使用更高级的字母间距工具包microtype
(以 pkg 形式单独提供letterspace
)。特别是当您必须处理长段文本、索引命令或类似内容时。
soulutf8
尽管最近进行了更新并兼容 Unicode,但仍然受到旧soul
软件包的一些限制。\textso
与其他一些宏的交互很差。在更常见的宏中,在参数中使用\index
或会中止编译,而使用或数学模式会破坏字母间距功能(下面的示例)。有解决方法,但它们可能会变得非常丑陋:在最后一个示例中,您每次都需要“关闭”和“重新打开” ,这反过来又导致太短\cite
\mbox
\textso
跨国公司单词空格。
letterspace
可以轻松处理这些情况,此外在选择字母间距量(逐个或全局)方面也更加灵活。当然,它可以与accsupp
Steven Segletes 和您的方法相结合。
\documentclass{article}
\usepackage{letterspace} % or microtype
\usepackage{soulutf8}
\begin{document}
\textso{triangle $ABC$} (\verb|\textlso|)
\textls[250]{triangle $ABC$} (\verb|\textls|)
\bigskip
\textls{foo \mbox{bar} \index{baz}baz (\cite{mybook})}
(\verb|\textls|, mbox index and cite succeed)
\textls[250]{foo bar baz} (\verb|\textls|)
%\textso{foo bar \index{baz}baz} (\verb|\textlso|) % doesn't compile!
%\textso{foo bar baz \cite{mybook}} (\verb|\textlso|) % doesn't compile!
\textso{foo \mbox{bar} \protect\index{baz}baz (\protect\cite{mybook})}
(\verb|\textlso|, mbox index and cite prevent letterspacing)
\textso{foo} \mbox{\textso{bar}} \index{baz}\textso{baz} (\cite{mybook})
(\verb|\textlso|, requires some contorsions, messes up interword spaces)
\end{document}
答案2
问题已解决,感谢史蒂文·B·塞格莱特斯:
\documentclass{article}
\usepackage{accsupp}
\usepackage{soulutf8}
\newcommand\an[1]{%
\BeginAccSupp{method=escape,ActualText={\detokenize{#1}}}%
\so{#1}%
\EndAccSupp{}%
}
\def\emph{\an}
\begin{document}
Try to copy this \emph{word} --- you will see ``word'', but not ``\emph{word}''.
\end{document}