考虑这个简单的文档:
\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