opmac 和 amstex 与 xetex 不兼容

opmac 和 amstex 与 xetex 不兼容

考虑这个简单的文档:

 \input amstex
 \input opmac

 \hyperlinks \Blue \Green

 \maketoc

 \chap Chapter

 \bye

如果使用pdftex或编译则luatex不会出现问题;而使用xetex则会出现错误消息“!\next 的使用不符合其定义。...”。该问题是由超链接的激活引起的(我认为问题出在opmac-xetex.tex检测到 xetex 引擎时额外加载的文件中。)

查看错误消息,我发现,作为一种解决方法,这

 \input amstex
 \catcode`\@=11
 \let\at@\relax

 \input opmac

 \hyperlinks \Blue \Green

 \maketoc

 \chap Chapter

 \bye

但这不是一个好的解决方案,因为我无法恢复 @ 的类别代码,而且我认为 amstex 需要某种方式\at@。有什么好的解决方案吗?

答案1

使用 OPmacamstex.tex可能会带来问题。例如,您发现将amstex.tex设置@为活动状态。因此,用户必须写入:

\input amstex \catcode`\@=12
\input opmac

当您计划在宏的参数中使用此功能(插入到索引)并对索引进行排序时,您无法\catcode`\@=\active在文档开头进行恢复(请参阅 OPmac 手册第 6 页)。更好的解决方案是仅在创建交换图时将 catcode 设置为仅在本地处于活动状态:@\ii@

\def\diagram{\begingroup\catcode`@=\active}
\def\enddiagram{\endgroup}

当数学公式包含在参数中时\write(例如,章节标题中的数学公式),可能会出现另一个问题。AMSTeX 没有想到有人需要做这样的事情:

\maketoc
...
\sec The function $\sin$

你可以尝试一下并查看文件*.ref。你会看到类似这样的内容:

\Xtoc{1}{\rm }{1}{The function $\mathop {\fam \z@ sin}\let \next \relax \def \countxviii@=\count42{\let \countxviii@=\count42\nolimits \countxviii@=\count42}\futurelet \next \countxviii@=\count42$ }{1}

另一方面,当\sin使用纯 TeX 的原始定义(不带\input amstex)时,您可以在*.ref文件中看到:

\Xtoc{1}{\rm }{1}{The function $\mathop {\fam 0\tenrm sin}\nolimits $ }{1}

这是很强大的,并且可以在 TOC 中正常工作(例如)。如果您需要避免此问题,则amstex.tex必须使用\addprotect许多控制序列:

\addprotect\sin \addprotect\cos ... etc.

可能接下来会出现问题。我不确定,因为我不了解 AMSTeX(我没有“TeX 的乐趣”手册)。

我强烈建议重新实现 AMSTeX 的功能,并且不要使用amstex.tex。如果有人需要从 ASMTeX 中实现一些有趣的功能,他/她可以给我发电子邮件,我可以编写新的OPmac 技巧在我的 www 页面上。这对我来说不是问题。

注意 、 的顺序\input opmac\input amstex如果先加载 OPmac,则 AMSTeX 字体数学设置将被激活,并且只有 10pt/7pt/5pt 和 CM 的静态字体大小可用。当您使用恢复顺序时,\typosize\typoscale也适用于数学字体,因为数学字体设置现在由宏文件完成ams-math.tex

答案2

amstex使其@在交换图宏和其他实用程序中处于活动状态。您可以在加载时禁用此行为opmac,并在稍后恢复。

\input amstex

% save the category code of @
\chardef\savedatcatcode=\catcode`@
% restore the standard code
\catcode`@=12

\input opmac

% restore amstex category code of @
\catcode`@=\savedatcatcode

\hyperlinks \Blue \Green

\maketoc

\chap Chapter

\bye

如果您想为章节使用更合理的名称,同时节省\sec割线,您可以这样做。

\input amstex

% save the category code of @
\chardef\savedatcatcode=\catcode`@
% restore the standard code
\catcode`@=12
\let\amstexsec\sec

\input opmac

% restore amstex category code of @
\catcode`@=\savedatcatcode
\let\section\sec
\let\sec\amstexsec
\let\chapter\chap

\hyperlinks \Blue \Green

\maketoc

\chapter Chapter

\section Section

\bye

相关内容