我想要一个删除变音符号的命令。我可以用 Python 编写这样的函数:
import unicodedata
def dediacritic(word):
result = u"".join([unicodedata.normalize("NFD", x)[0] for x in word])
return result
print("Ἰακώβ", dediacritic("Ἰακώβ"))
这似乎很有效:
$ dediacritic.py
Ἰακώβ Ιακωβ
但我希望能够在 Latex 中做到这一点。是否可以编写这样的函数(也许使用 Lua,因为我使用 lualatex)?
\documentclass{article}
\usepackage{fontspec}
\setmainfont{STIXTwoText-Regular}
\newcommand\dediacritic[1]{#1} % put what here?
\begin{document}
Ἰακώβ \dediacritic{Ἰακώβ}
\end{document}
答案1
您提供的代码的直接等价形式是
\documentclass{article}
\usepackage{fontspec}
\setmainfont{Noto Serif}
\ExplSyntaxOn
\cs_new:Npn \__mk_dediacritic_naive_codepoint:n #1 {
\tl_head:f { \codepoint_to_nfd:n { `#1 } }
}
\cs_new:Npn \mk_dediacritic_naive:n #1 {
\str_map_function:nN { #1 } \__mk_dediacritic_naive_codepoint:n
}
\cs_new_eq:NN \dediacritic \mk_dediacritic_naive:n
\ExplSyntaxOff
\begin{document}
Ἰακώβ \dediacritic{Ἰακώβ}
\end{document}
这只在 LuaLaTeX 和 XeLaTeX 中有效,因为它假定标记是完整的 Unicode 代码点。
不过,这在许多更复杂的情况下会失效,所以通常你会想要类似这样的
\documentclass{article}
\usepackage{fontspec}
\setmainfont{Noto Serif}
\ExplSyntaxOn
\cs_generate_variant:Nn \str_map_function:nN { e }
\cs_generate_variant:Nn \str_head:n { f }
\cs_new:Npn \__mk_dediacritic_decomposed_codepoint:n #1 {
\str_if_eq:eeF { \str_head:f { \codepoint_to_category:n { `#1 } } } { M } {
#1
}
}
\cs_new:Npn \__mk_dediacritic_codepoint:n #1 {
\str_map_function:eN { \codepoint_to_nfd:n { `#1 } } \__mk_dediacritic_decomposed_codepoint:n
}
\cs_new:Npn \mk_dediacritic:n #1 {
\str_map_function:eN { #1 } \__mk_dediacritic_codepoint:n
}
\cs_new_eq:NN \dediacritic \mk_dediacritic:n
\ExplSyntaxOff
\begin{document}
Ἰακώβ \dediacritic{Ἰακώβ}
\end{document}
如果类别以 开头,则检查每个分解的代码点M
,表示(组合)标记字符(又名变音符号)并将其删除。