Unicode 活动文本字符,用于宏

Unicode 活动文本字符,用于宏

这有效,但令人恐惧……它可靠吗,还是我正在利用未来不会存在的东西?使用 TeXlive 2024、LuaLaTeX、任何平台(我的是 Linux)。仅 Tex 模式,没有数学、表格、图表的复杂性。

\documentclass{article} % Compile with lualatex.
\usepackage{fontspec}
\catcode`\ff=13
\defff{AB}
\begin{document}
yffr
\end{document}

结果:yABr符合预期。

我的做法是先将其定义为活动字符(即 Unicode FB00),然后将其定义为宏。当然,我的实际用法要复杂得多。

上面的代码似乎适用于各种可能的 Unicode 字符。我不指望(或不需要)它适用于大多数字符。另外,我只会使用我使用的字体中已知的字符。

我再次问:这可靠吗?

答案1

它相当可靠,但并不完全可靠。而且它需要Unicode 引擎,xetex或者luatex

例如,如果您有\section{ff},那么.toc您会在文件中看到AB,这可能不是您想要的。

此外,你不能根据其本身来定义。 的常见用法newunicodechar是用字体替换主字体中不存在的符号(通常如此)。假设你最喜欢的字体没有 的字形,但你在 Symbola 中有。

然后你可以做

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

\setmainfont{Latin Modern Roman}
\newfontface{\symbola}{Symbola}

\newunicodechar{☯}{{\normalfont\symbola ☯}}

\begin{document}

\section{Yin Yang ☯}

☯ is a nice glyph.

\end{document}

在此处输入图片描述

不要尝试

\catcode`☯=\active
\def ☯{{\normalfont\symbola ☯}}

或者,也许尝试一下,只是为了发现

! TeX capacity exceeded, sorry [input stack size=10000].
<to be read again>
                   {
l.16 \section{Yin Yang ☯}

但是,这主要取决于你想做什么。我不建议随机取一个未使用的 Unicode 字符并将其定义为活动字符并执行一些与字符本身无关的操作。这可能看起来很有趣,也许很有用:但事实并非如此。


为什么它可以工作\newunicodechar?因为代码有

\def\newunicodechar#1#2{...}

因此,第二个参数在执行活动字符的定义之前就被标记化#1,因此在作为字符传递的代码中,#2该字符将具有其正常的类别代码。

顺便说一句,该包也适用于pdflatex,但在这种情况下,您不能在替换文本中使用字符。

答案2

使用 lualatex unicode 输入,例如ü

答案3

如何实现与 egreg 的答案中所示的相同输出,但使用 OpTeX:

\fontfam[lm]            % default font family
\sfont\symbola=Symbola  % \symbola is font scaled by the context
\adef ☯{{\symbola ☯}}   % the character ☯ is active, defined by non-active ☯

\sec Yin Yang ☯

☯ is a nice glyph.

\bye

相关内容