跟进这个问题。
对于此字体和相当多其他字体,小写字母在复制时显示为大写,如以下输出中的第 1 行和第 4 行所示。我试图覆盖每个单独的 unicode 值,使其在输出中与输入中相同,并尽可能对扩展的命令执行相同操作。也许我误解了扩展的工作原理。
这是
\@tfor
正确的工具吗?是否可以让它尊重空格,同时仍然单独影响每个字符?accsupp
好像有更多级别的扩展。这可以扩展吗?扩展命令的正确用法是什么?是否有命令可以扩展,直到没有命令可以扩展为止?
输出
MULTIPLE WORDS OCTOBER 11, 2018
MultipleWords\today
MultipleWords\today
MULTIPLE WORDS OCTOBER 11, 2018
MultipleWordsOctober 11, 2018
MultipleWordsOctober 11, 2018
平均能量损失
\documentclass{report}
\usepackage{fontspec}
\setmainfont{SourceSerifPro-Regular.otf}
\usepackage{tagpdf}
\tagpdfsetup{uncompress,activate-all}
\usepackage{accsupp}
\makeatletter
\DeclareRobustCommand*{\actualtext}[1]{{%
\@tfor\next@letter:=#1\do{%
\tagmcbegin{tag=Span,actualtext-o=\next@letter}%
\next@letter%
\tagmcend%
}%
}}%
\DeclareRobustCommand{\PDFreplace}[1]{{%
\@tfor\next@letter:=#1\do{%
\BeginAccSupp{method=escape,ActualText=\next@letter}%
\next@letter%
\EndAccSupp{}%
}%
}}%
\makeatother
\begin{document}
{\scshape{Multiple Words \today}}
{\scshape\actualtext{Multiple Words \today}}
{\scshape\expandafter\actualtext\expandafter{Multiple Words \today}}
{\scshape{Multiple Words \today}}
{\scshape\PDFreplace{Multiple Words \today}}
{\scshape\expandafter\PDFreplace\expandafter{Multiple Words \today}}
\end{document}
答案1
我假设您的真正目标是将小写小型大写字母复制为小写字母。虽然可以使用 Actualtext 在小部分中完成此操作,但它不适用于任意文本,也许不可扩展的文本。
使用 luatex 的更好的解决方案是改变 tounicode 值:
\documentclass{report}
\usepackage{fontspec}
\setmainfont{SourceSerifPro-Regular.otf}
\usepackage{luacode}
\begin{luacode}
local scnames = { -- needs extension, can be done with a lua loop.
["A.sc"] = "0062",
["B.sc"] = "0062",
["C.sc"] = "0063",
["D.sc"] = "0064",
["E.sc"] = "0065",
["F.sc"] = "0066",
["G.sc"] = "0067",
["I.sc"] = "0069",
["L.sc"] = "006C",
["O.sc"] = "006F",
["P.sc"] = "0070",
["R.sc"] = "0072",
["S.sc"] = "0073",
-- ....
["T.sc"] = "0074",
["U.sc"] = "0075",
}
local patch_sccopy = function (fontdata)
if fontdata.resources.unicodes then
for k, v in pairs(fontdata.resources.unicodes) do
if scnames[k] then
fontdata.characters[v]["tounicode"] = scnames[k]
end
end
end
end
luatexbase.add_to_callback
(
"luaotfload.patch_font",
patch_sccopy,
"change_copy_sclowercase"
)
\end{luacode}
\begin{document}
{\scshape Multiple Words \today }
Copies as: Multiple Words October 12, 2018
\end{document}
我没有检查其他字体是否使用A.sc
大写小写字母 A 的名称,因此现在会错误地将 A 复制为 a。如果发生这种情况,则必须将补丁限制在特定字体上。