删除变音符号的命令

删除变音符号的命令

我想要一个删除变音符号的命令。我可以用 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,表示(组合)标记字符(又名变音符号)并将其删除。

相关内容