我想->
为 创建一个快捷方式\rightarrow
。使用 Plain TeX 可以实现吗?还是与加载的字体有关?
答案1
让-
数学变得活跃并赋予其适当的定义。
\edef\minus{\mathchar\the\mathcode`-\space}
\def\lookaheadminus{\futurelet\next\whatsafter}
\def\whatsafter{%
\ifx\next>%
\expandafter\togr
\else
\expandafter\minus
\fi}
\def\togr>{\to}
\begingroup\lccode`~=`-
\lowercase{\endgroup\let~}\lookaheadminus
\mathcode`-="8000
$A->B$ and $a-b$
\bye
那么就避免这么做。
您可能喜欢使用 UTF-8 字符来实现此目的:
% <E2> is one of the prefixes for three byte UTF-8 sequences
\catcode"E2=\active
\protected\def^^e2#1#2{\csname\detokenize{^^e2#1#2}\endcsname}
%% similar definition to the above should be made for
%% other prefixes
% the following defines a single Unicode character
\def\defineutfchar#1{%
\protected\expandafter\def\csname\detokenize{#1}\endcsname}
\defineutfchar{→}{\to}
$A→B$
\bye
答案2
一次谦虚的、有缺陷的尝试,灵感来自 tohecz,主要基于我对使用 Grawlixes 审查脏话:
文件converter.lua
:
symbols = { "%-%>", "%=%>", "%<%-", "%<%=" }
replacements = { ["%-%>"] = "\\rightarrow ", ["%=%>"] = "\\Rightarrow ", ["%<%-"] = "\\leftarrow ", ["%<%="] = "\\Leftarrow " }
function replace(line)
for _, element in pairs(symbols) do
if string.find(line, element) then
return string.gsub(line, element, replacements[element])
end
end
return line, 0
end
function converter(line)
occurrences = 0
repeat
line, occurrences = replace(line)
until occurrences == 0
return line
end
callback.register('process_input_buffer', converter)
然后,在主 TeX 文件中:
\directlua{dofile('converter.lua')}
Hello world, $A -> B$, $A => B$, $B <- A$, $B <= A$.
\bye
当然,此解决方案需要 LuaTeX。:)
输出:
我至少可以指出一个问题:
- 简单的替换算法,它只是基于模式替换。文本的某些部分可能会出现严重问题。
改进此代码可能对读者来说是一项很好的练习。:)