覆盖 \def 来检查命令是否存在?

覆盖 \def 来检查命令是否存在?

LyX 支持数学宏,但遗憾的是,当传递给乳胶处理器时,它们是由\def而不是新命令定义的。

我发现覆盖命令(例如使用\def\v{\mathbf{v}})会导致难以调试的错误,尤其是当 BibTeX 文件条目引入需要命令原意的名称时。因此我想改变这种行为——要求 LyX 进行更改不太可能成功(破坏向后兼容性),最多需要等待下一个二进制版本(Windows)或自己用补丁编译它(Linux)。

因此我想知道是否可以(本地)覆盖\def来调用\newcommand

我试过

\documentclass[]{article}
\begin{document}

\begingroup % for locality of the redefinition
    \let\odef\def
    \renewcommand{\def}[1]{\newcommand{#1}{}\odef#1}
    \def\xx{{\bf x}} \xx
\endgroup

\end{document}

但这失败了

! TeX capacity exceeded, sorry [input stack size=5000].
\@ifstar #1->\@ifnextchar *{\@firstoftwo {#1
                                            }}
l.18  \def\xx
             {{\bf x}} \xx

大概与内部使用 \def 的 \newcommand 相关。

答案1

我已经弄清楚了:

\documentclass[]{article}
\begin{document}

\let\odef\def
\odef\def#1{\odef\dummy{}{\let\def\odef\newcommand{#1}{}}\odef#1}
% <LYXDEFINITIONS>
\global\long\def\xx{{\bf x hello}} \xx
\global\long\def\yy{{\bf y world}} \yy 
% </LYXDEFINITIONS>
\let\def\odef

\end{document}

诀窍是将\def的持续时间内的原始定义返回到\newcommand

现在只剩下不良副作用的问题(尽管仅用于 LyX 的数学宏时不应该有任何副作用)。

相关内容