\newunicodechar 仅当未声明时?

\newunicodechar 仅当未声明时?

我正在使用LuaLaTeX。我收到的一些源文件包含不受普遍支持的 Unicode 字符。到目前为止,常见的有:

\documentclass{article}

\usepackage{newunicodechar}
    \newunicodechar{^^^^2e3a}{—\,—} % hair spaces for testing only
    \newunicodechar{^^^^2e3b}{—\,—\,—}

\begin{document}

This is a TWO-EM DASH (U+2E3A): ⸺

This is a THREE-EM DASH (U+2E3B): ⸻

\end{document}

在此处输入图片描述

请注意,在上面的例子中,我不得不“伪造”(重新定义)两个字符,因为拉丁现代统一码缺少所需的字形。但许多其他字体都有这些字形:有没有办法让我\newunicodechar有条件地只对需要它的字体使用(或其他方法)?我讨厌使用一些代用品如果字形确实存在于所选字体中,则为字符或方法。

编辑:按照David的建议,我取得了一些进展:

\documentclass{article}
\usepackage{newunicodechar}

\iffontchar\font "2e3a \else {%
\newunicodechar{^^^^2e3a}{—\,—}%
} \fi

\begin{document}

This font has \iffontchar\font "2014 \else {\textbf{no}} \fi support for EM DASH (U+2014): —

This font has \iffontchar\font "2e3a \else {\textbf{no}} \fi support for TWO-EM DASH (U+2E3A): ⸺

\end{document}

但它在序言中不起作用。(而\newunicodechar在序言之外则不起作用。)我做错了什么?没有错误,只是没有达到预期的结果。

在此处输入图片描述

编辑2:我明白了。请参阅下面的完整答案。

答案1

对于 luatex(或 xetex 也一样),您使用的不是 CM 字体,而是拉丁现代 Unicode。对于 Unicode TeX,您可以询问当前字体是否具有带有

\iffontchar \font "2E3A

答案2

您想在使用时测试其存在性。我离开了\,,而不是可能\!只是想看看有什么不同。

\documentclass{article}
\usepackage{fontspec}
\usepackage{newunicodechar}

\newunicodechar{⸺}{\iffontchar\font`⸺\relax ⸺\else---\,---\fi}

\newfontface{\test}{Source Sans Pro}

\begin{document}


\test⸺

\end{document}

在此处输入图片描述

该字形在 Latin Modern 中不存在,但在 Source Sans Pro 中存在。

答案3

明白了。毕竟是语法错误。我发布了我的解决方案:

\documentclass{article}
\usepackage{newunicodechar}

\iffontchar\font "2e3a%
\relax\else\newunicodechar{^^^^2e3a}{—\,—}%
\fi

\begin{document}

This font has \iffontchar\font "2014 
\else {\textbf{no}} \fi support for EM DASH (U+2014): —

This font has \iffontchar\font "2e3a 
\else {\textbf{no}} \fi support for TWO-EM DASH (U+2E3A): ⸺

\end{document}

在此处输入图片描述

相关内容