![如何更改 Type1 字体中的字符代码?](https://linux22.com/image/325200/%E5%A6%82%E4%BD%95%E6%9B%B4%E6%94%B9%20Type1%20%E5%AD%97%E4%BD%93%E4%B8%AD%E7%9A%84%E5%AD%97%E7%AC%A6%E4%BB%A3%E7%A0%81%EF%BC%9F.png)
我需要使 pdf 中行首的空格可复制,并想出了以下技巧。
在 lm-rmtt.enc 中我更改/tilde
为/nbspace
然后使用此代码:
\font\myfont=rm-lmtt10
\def\myspace{{\myfont\char`~}}
{\obeyspaces\global\let =\myspace}
这样,当我说时\obeyspaces
,我会在pdf的行首得到可复制的空格:
\font\tentt=cmtt10
\tentt
\obeyspaces
hello
效果很好,但我想问一下这种方式是否“合法”。如果直接使用 pdftex,并且使用 dvipdfmx,度量会怎样?我知道他们从 Type1 字体中获取度量,而不关注 tfm 文件。在这种情况下使用什么度量?
答案1
首先我尝试编译你的例子\pdfcompresslevel=0
,我得到了
BT
/F51 9.9626 Tf 91.925 759.927 Td [(~~~~~~~~~)]TJ/F30 9.9626 Tf 47.074 0 Td [(hello)]TJ/F1 9.9626 Tf 164.51 -654.747 Td [(1)]TJ
ET
如您所见,PDF 文件包含重复的波浪号,但字体资源具有修改后的编码,因此此波浪号在 PDF 查看器中将显示为其他内容。
然后,我做了其他事情:我也变成了/i
并将/nbspace
您的示例文件修改为
\pdfcompresslevel=0
\pdfmapline{=rm-lmtt10 LMMono10-Regular " enclmrmtt ReEncodeFont " <lm-rmtt-mod.enc <lmtt10.pfb}
\font\myfont=rm-lmtt10
\def\myspace{{\myfont\char`~}}
{\obeyspaces\global\def {\myspace}}
\font\tentt=cmtt10
\tentt
\obeyspaces
hello
\def\myspace{{\myfont\char`i}}%
hello
\bye
(请注意,这lm-rmtt-mod.enc
是修改后的.enc
文件,因为我不想篡改默认文件)。这是我在 PDF 文件中得到的内容
BT
/F51 9.9626 Tf 91.925 759.927 Td [(~~~~~~~~~)]TJ/F30 9.9626 Tf 47.074 0 Td [(hello)]TJ/F51 9.9626 Tf -47.074 -11.955 Td [(iiiiiiiii)]TJ/F30 9.9626 Tf 47.074 0 Td [(hello)]TJ/F1 9.9626 Tf 164.51 -642.792 Td [(1)]TJ
ET
这是我在 Adobe Reader 中选择所有文本时看到的内容
这表明所有空间都是“可见的”。
如果我在 Skim(基于 Apple PDFKit 的预览器)上执行相同的“全选”操作,我会看到
没有复制空格。因此,复制空格的可能性取决于预览器。
但请注意,如果我从 Adobe Reader 的顶行执行“复制”,然后粘贴到编辑器窗口中,我会得到
“看到”的是空格,但底层文本仍然有波浪符号。
答案2
您也可以尝试。\pdffakespace
但是\pdfinterwordspaceon
,虽然在下面的例子中,“f”从 pdf 中复制得很好,但有时会缺少空格,或者只有一个而不是很多,00A0 被复制为 0020 —— 我不认为 TeX 会删除它们,空格之间的方框也会发生这种情况。所以在我看来,pdf 查看器试图变得太智能了。
\documentclass{article}
\begin{document}
\pdfglyphtounicode{space}{0066} %f to see it better
{\obeyspaces\gdef {~\pdffakespace}}
hello\pdffakespace hello
\obeyspaces
x hello
g
\end{document}
然后复制为
hellofhello
x f f f f f f fhello
f f f f f f f fg