请看下表:
\documentclass{article}
\begin{document}
\begin{tabular}{|c|c|}
11 & 21 \\
12 & 22 \\
\end{tabular}
\end{document}
有哪些技术可以使该表的文本可复制(尽可能)?
例如,Evince 将其视为文本(请注意,顺序和行丢失):
11
12
21
22
(在这种情况下,Acrobat 的表现会稍微好一些,但在处理较大的表格时仍然会感到困惑)。
我探索过的一个替代方法是使用accsup
。但是我不知道如何强制使用制表符(单元格之间)和新行;这不起作用:
\documentclass{article}
\usepackage{accsupp}
\begin{document}
\BeginAccSupp{ActualText=11\t 21\n 12\t 22\n} %this line produces errors
\begin{tabular}{|c|c|}
11 & 21 \\
12 & 22 \\
\end{tabular}
\EndAccSupp{}
\end{document}
我必须输入什么代码才能将其作为可复制文本11 \tab 21 \n 12 \tab 22 \n
? 是否有其他技术可以帮助 PDF 查看器以更合理的方式跟踪(流动)可复制文本?
编辑accsup
:我通过定义逐行替代文本取得了一些进展:
\documentclass{article}
\usepackage{accsupp}
\begin{document}
\begin{tabular}{|c|c|}
\BeginAccSupp{ActualText=11 21} 11 & 21 \EndAccSupp{} \\
\BeginAccSupp{ActualText=11 21} 12 & 22 \EndAccSupp{} \\
\end{tabular}
\end{document}
我仍然不知道如何添加制表符,但复制功能已经有所改进
编辑2:我可以用 生成制表符,
\BeginAccSupp{method=hex,unicode,ActualText=0009}
但是无法将其与普通文本结合。(如ActualText=a ?0009? b
)。
编辑3:Heiko 的答案的逐行变体:
\documentclass{article}
\usepackage{accsupp}
\begin{document}
\begin{tabular}{|c|c|}
\BeginAccSupp{method=plain, ActualText=11\string\t 21}
11 & 21
\EndAccSupp{}\\
\BeginAccSupp{method=plain, ActualText=12\string\t 22}
12 & 22
\EndAccSupp{}\\
\end{tabular}
\end{document}
答案1
方法pdfstringdef
如果hyperref
已加载,则可用并可以通过以下方式\pdfstringdef
用于包:accsupp
method=pdfstringdef
\documentclass{article}
\usepackage[pdfencoding=auto]{hyperref}
\usepackage{accsupp}
\begin{document}
\BeginAccSupp{
method=pdfstringdef,
ActualText=11\unichar{"0009}21\unichar{"000A}12\unichar{"0009}22\unichar{"000A},
}
\begin{tabular}{|c|c|}
11 & 21 \\
12 & 22 \\
\end{tabular}
\EndAccSupp{}
\end{document}
\textHT
可以用来代替\unichar{"000A}
和。\textLF
\unichar{"000A}
方法pdfstringdef
是最舒适的方法,因为它支持广泛的 TeX 代码。\pdfstringdef
是用于书签的相同宏。
方法plain
最危险的方法是plain
,这里给出了字符串,因为它应该在扩展后出现在 PDF 文件中。要求对 PDF 或 PostScript 的字符串语法有很好的了解。
\t
和\n
通常不能直接使用,因为它们不会扩展为自身,\t
是重音命令并且\n
通常未定义。这里\string
(或\detokenize
) 可用于将\t
和转换\n
为两个字符标记\
andt
或\
and \n
:
\documentclass{article}
\usepackage{accsupp}
\begin{document}
\BeginAccSupp{
method=plain,
ActualText=11\string\t 21\string\n 12\string\t 22\string\n,
}
\begin{tabular}{|c|c|}
11 & 21 \\
12 & 22 \\
\end{tabular}
\EndAccSupp{}
\end{document}
方法escape
的风险plain
是,如果反斜杠放在错误的位置或括号不匹配,则会导致 PDF 文件损坏/无效。方法escape
通过转义有问题的字符来避免这种情况。因此\t
和\n
不能以与方法相同的方式使用plain
,因为反斜杠本身会被转义。相反,宏应该扩展为字符标记:
\documentclass{article}
% define \HT as horizontal tabular
\begingroup
\lccode`\0=9\relax
\lowercase{\endgroup
\def\HT{0}%
}
% define \LF as line feed
\begingroup
\lccode`\0=10\relax
\lowercase{\endgroup
\def\LF{0}%
}
\usepackage{accsupp}
\begin{document}
\BeginAccSupp{
method=escape,
ActualText=11\HT 21\LF 12\HT 22\LF,
}
\begin{tabular}{|c|c|}
11 & 21 \\
12 & 22 \\
\end{tabular}
\EndAccSupp{}
\end{document}
答案2
我不是 PDF 专家。您认为 PDF 包含表格之类的内容,这种观点似乎值得怀疑。我认为 PDF 中没有表格,只有规则和字形。
第一步:复制 PDF 的内容。复制什么?复制内容,无论 PDF 中的内容是什么:字形、图形。有些软件能够用信息丰富将传输到剪贴板的内容。例如,我的旧版 Acrobat Pro 提供将文本“复制为表格”的功能。但这取决于 PDF 的查看器。据我所知,没有办法将 PDF 中的表格标记为“TABLE”。
现在,你把剪贴板的内容粘贴到另一个软件中。也许这个软件会分析剪贴板的内容并识别出表格的轮廓。
在某些情况下使用该命令似乎有所改进\pdfinterwordspaceon
,但我自己的测试显示结果不佳。
所以:如果您希望共享表格,请不要将它们打印成 PDF。