使用 soul/soulutf8 调整字母间距

使用 soul/soulutf8 调整字母间距

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可以轻松处理这些情况,此外在选择字母间距量(逐个或全局)方面也更加灵活。当然,它可以与accsuppSteven 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}

相关内容