![Unicode 活动文本字符,用于宏](https://linux22.com/image/475110/Unicode%20%E6%B4%BB%E5%8A%A8%E6%96%87%E6%9C%AC%E5%AD%97%E7%AC%A6%EF%BC%8C%E7%94%A8%E4%BA%8E%E5%AE%8F.png)
这有效,但令人恐惧……它可靠吗,还是我正在利用未来不会存在的东西?使用 TeXlive 2024、LuaLaTeX、任何平台(我的是 Linux)。仅 Tex 模式,没有数学、表格、图表的复杂性。
\documentclass{article} % Compile with lualatex.
\usepackage{fontspec}
\catcode`\ff=13
\defff{AB}
\begin{document}
yffr
\end{document}
结果:yABr
符合预期。
我的做法是先将其定义ff
为活动字符(即 Unicode FB00),然后将其定义为宏。当然,我的实际用法要复杂得多。
上面的代码似乎适用于各种可能的 Unicode 字符。我不指望(或不需要)它适用于大多数字符。另外,我只会使用我使用的字体中已知的字符。
我再次问:这可靠吗?
答案1
它相当可靠,但并不完全可靠。而且它需要Unicode 引擎,xetex
或者luatex
。
例如,如果您有\section{ff}
,那么.toc
您会在文件中看到AB
,这可能不是您想要的。
此外,你不能ff
根据其本身来定义。 的常见用法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 输入,例如ff
或ü
或
答案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