编辑

编辑

动机是,我有时会有,例如

% !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}

在此处输入图片描述

相关内容