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 的数学宏时不应该有任何副作用)。