动机是,我有时会有,例如
% !TEX encoding = UTF-8 Unicode
\catcode`¯=\active
\def¯#1#2{\overline{#1#2}}
$¯ab+¯bc=¯ac$
在我的代码中。我认为如果有一个宏就好了,\activatedefine
比如
\activatedefine¯#1#2{\overline{#1#2}}
做那项工作\catcode
并\def
做。
我知道这样写是不对的
\def\activatedefine#1{
\catcode`#1=active
\def#1
}
因为第三行的 catcode#1
没有改变。但我听说\futurelet
可以重复 token。所以我想到了
\def\activatedefine{
\futurelet\thechar\nowwecanplaywiththechar
}
\def\nowwecanplaywiththechar{
\expandafter\catcode\expandafter`\thechar=13
\def
}
这仍然不太正确,因为\thechar
没有扩展到¯
。所以我尝试修复它
\def\activatedefine{
\futurelet\thechar\nowwecanplaywiththechar
}
\def\gobbletwo#1 #2 {}
\def\nowwecanplaywiththechar{
\edef\activatethechar{
\noexpand\catcode`\expandafter\gobbletwo\meaning\thechar=\active
}
%\message{^^J^^J \string\activatethechar is \meaning\activatethechar}
\activatethechar
%\message{^^J The catcode becomes \the\catcode`¯^^J^^J}
\def
}
\activatedefine¯#1#2{\overline{#1#2}}
此宏确实将 的 catcode 更改¯
为13
。但是 TeX 会抱怨Missing control sequence inserted
。
我的代码出了什么问题?
编辑
差点忘了 MWE
% !TEX TS-program = XeLaTeX
% !TEX encoding = UTF-8 Unicode
\documentclass{article}
\begin{document}
\def\activatedefine{\futurelet\thechar\nowwecanplaywiththechar}
%\def\nowwecanplaywiththechar{
% \expandafter\catcode\expandafter`\thechar=13
% \def
%}
\def\gobbletwo#1 #2 {}
\def\nowwecanplaywiththechar{%
\edef\activatethechar{%
\noexpand\catcode`\expandafter\gobbletwo\meaning\thechar=\active
}
\message{^^J^^J \string\activatethechar is \meaning\activatethechar}
\activatethechar
\message{^^J The catcode becomes \the\catcode`¯^^J^^J}
\def¯
}
\activatedefine¯#1#2{\overline{#1#2}}
\end{document}
答案1
\documentclass{article}
\def\activatedefine#1{\begingroup\lccode`~=`#1\relax
\lowercase{\endgroup\def~}}%
\activatedefine¯#1#2{\overline{#1#2}}
\begin{document}
$¯ab+¯bc=¯ac$
\end{document}
\documentclass{article}
\def\activatedefine#1{\begingroup\lccode`~=`#1\relax
\lowercase{\endgroup\catcode`#1\active\def~}}%
\activatedefine|#1#2{\overline{#1#2}}
\begin{document}
$|ab+|bc=|ac$
\end{document}
我没有太注意实际的宏,它处于数学模式,所以数学活动可能会更好。
此外,我不想处理 UTF-8,因此我使用|
它作为示例。
啊!但楼主使用的是 XeTeX。所以我们可以这样做
\documentclass{article}
\def\activatedefine#1{\begingroup\lccode`~=`#1\relax
\lowercase{\endgroup\catcode`#1\active\def~}}%
\activatedefine¯#1#2{\overline{#1#2}}
\begin{document}
\the\catcode`¯ % ONLY XETEX, NOT PDFTEX!
$¯ab+¯bc=¯ac$
\end{document}
% Local variables:
% TeX-engine: xetex
% End:
pdflatex 的问题在于它¯
是多字节的,并且我答案顶部的删除代码正在重新定义第一个字节,从而破坏了 LaTeX UTF-8。
答案2
最简单的方法是使用\newunicodechar
;它只是定义无参数的宏,但我们可以利用 TeX 是一种宏扩展语言这一事实。
请注意,这些示例可以与全部TeX 引擎(Knuth TeX 除外)。
\documentclass{article}
\usepackage{newunicodechar}
\newunicodechar{‾}{\overline}
\newcommand{\twooverline}[2]{\overline{#1#2}}
\newunicodechar{﹌}{\twooverline}
\begin{document}
$‾a$ $﹌ab$
\end{document}
另一个例子:
\documentclass{article}
\usepackage{newunicodechar}
\makeatletter
\newunicodechar{‾}{\symbol@overline}
\def\symbol@overline#1‾{\overline{#1}} % must go second
\begin{document}
$‾abc‾$
\end{document}