我有一个带有真实 OT 上标的字体,我可以轻松地将其与realscripts
-package 一起使用。但我还需要一个上标小数点,但它不存在,因此realscripts
会返回到常规形式。这是预期的行为,但我想自动替换出现的\fakesuperscript{.}
任何地方\textsuperscript{.}
。
我尝试了一个粗暴的破解方法,我将任意 unicode 字符声明为“period.superscript”,并尝试让 Lua 将其添加到字体功能中。这两个部分可以单独工作,但不能组合使用;我怀疑 lua 指令是在 之前处理的\newunicodechar
,不是吗?
有没有办法通过以某种方式改变流程的顺序来使我的黑客工作?
或者有没有其他方法可以让\fakesuperscript
s 替代缺失的真实上标?对我来说,是否全部替换或是否必须逐个定义它们并不重要。任何一种解决方案都可以。
\documentclass{article}
\usepackage[no-math]{fontspec}
\setmainfont{Linux Libertine O}
\usepackage{realscripts}
\usepackage{newunicodechar}
\newunicodechar{}{\fakesuperscript{.}}
\directlua{
fonts.handlers.otf.addfeature{
name = "sups",
type = "substitution",
data = {
period = "",
["period.onum"] = "",
Q = "Ɋ",
["Q.onum"] = "Ɋ",
},
}
}
\begin{document}
I can use the defined char directly: o\textsuperscript{1}\textsuperscript{5}o
But not, as I hoped, via the superscript-command: o\textsuperscript{1.5}o
The \textsuperscript{Question} whether the Lua part works is obviously answerd by yes.
\end{document}
答案1
\newunicodechar{}{\fakesuperscript{.}}
定义一个命令(活动字符)。此命令在完成任何字体相关操作之前进行处理。在 中period = "",
不是
命令,而是字形。它不会扩展为\fakesuperscript
。
我认为最简单的方法是替换有问题的符号(这也可以用 lua 来完成,我在这里使用 expl3-regex):
\documentclass{article}
\usepackage[no-math]{fontspec}
\setmainfont{Linux Libertine O}
\usepackage{realscripts}
\ExplSyntaxOn
\NewDocumentCommand\mysuperscript{m}
{
\tl_set:Nn\l_tmpa_tl{#1}
\regex_replace_all:nnN {\.}{\c{fakesuperscript}\cB\{\.\cE\}}\l_tmpa_tl
\regex_replace_all:nnN {\Q}{\c{fakesuperscript}\cB\{\Q\cE\}}\l_tmpa_tl
\textsuperscript{\l_tmpa_tl}
}
\ExplSyntaxOff
\begin{document}
o\mysuperscript{1.5}
o\mysuperscript{Question}
\end{document}