如何更改 Type1 字体中的字符代码?

如何更改 Type1 字体中的字符代码?

我需要使 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

这是我在 Adob​​e Reader 中选择所有文本时看到的内容

在此处输入图片描述

这表明所有空间都是“可见的”。

如果我在 Skim(基于 Apple PDFKit 的预览器)上执行相同的“全选”操作,我会看到

在此处输入图片描述

没有复制空格。因此,复制空格的可能性取决于预览器。

但请注意,如果我从 Adob​​e 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

相关内容