这是我正在考虑的问题以及一些可能的方法。当使用 lwarp 编写 latex/html 文档时,数学代码直接嵌入到生成的 HTML 文件中,并由 mathjax 进行解释。
如果其中有非标准宏,它们将不会被 latex 扩展,并且 mathjax 将不知道如何处理它们——(1) 如下。标准方法是只给 mathjax 宏定义(\CustomizeMathJax
如下)。Mathjax 有用于此目的的宏,我不反对。
但是,有时宏比这更复杂;例如,在最近的一个应用程序中,我需要一个将参数添加到固定偏移量的宏。这在 tex 中很简单;在 mathjax 中,我需要在 JS 中重新实现宏(现在当我切换 MathJax 3 时,我需要重新实现它。)
这似乎是进行某种受控扩张的理想场所。例如,请考虑以下示例。
\documentclass{article}
\usepackage[mathjax]{lwarp}
\newcommand\xyz{x}
\newcommand\bfxyz{\mathbf{x}}
% `Standard' solution:
%\CustomizeMathJax{\newcommand\xyz{x}}
%\CustomizeMathJax{\newcommand\bfxyz{\mathbf{x}}}
\begin{document}
\[ (1) \quad a + b = \xyz,\bfxyz . \]
\edef\mymath{%
\noexpand\[ (2) \noexpand\quad a + b = \xyz. \noexpand\]
}
\mymath
\edef\mymath{%
\noexpand\[ (3) \noexpand\quad a + b = \expandonce\bfxyz. \noexpand\]
}
\mymath
\end{document}
使用 edefs 并仅扩展某些宏,我可以让 tex 进行扩展,而不必担心 mathjax 看到什么。
然而,这显然不是一个真正的解决方案:我不得不\noexpand
在前面添加很多与数学模式相关的东西。我还必须非常小心扩展了多少次,要么\expandonce
像 (3) 中那样添加,要么将宏定义重写为\newcommand\bfxyz{\noexpand\mathbf{x}}
。
我觉得我真正想做的是扩大仅有的某个列表中的宏(例如 \xyz、\bfxyz),并一直执行直到列表中没有任何内容。但也许还有另一种我不知道的方法——可能是使用\protected@edef
?
那么,有没有更好的办法来解决这个问题呢?
答案1
我认为\protected@edef
这里满足您的需要:
\documentclass{article}
\usepackage[mathjax]{lwarp}
\newcommand\xyz{x}
\newcommand\bfxyz{\mathbf{x}}
% `Standard' solution:
%\CustomizeMathJax{\newcommand\xyz{x}}
%\CustomizeMathJax{\newcommand\bfxyz{\mathbf{x}}}
\makeatletter
\begin{document}
\[ (1) \quad a + b = \xyz,\bfxyz . \]
\protected@edef\mymath{%
\[ (2) \quad a + b = \xyz.\]
}
\show\mymath
\mymath
\protected@edef\mymath{%
\[ (3) \quad a + b = \bfxyz. \]
}
\show\mymath
\mymath
\end{document}
生成此日志
> \mymath=macro:
->\protect \[ (2) \hskip 1em\relax a + b = x.\protect \] .
l.19 \show\mymath
?
> \mymath=macro:
->\protect \[ (3) \hskip 1em\relax a + b = \protect \mathbf {x}. \protect \] .
l.25 \show\mymath
如果有任何标准命令在 protected@edef 中扩展,您可以将其重新声明为健壮的,\MakeRobust\zzz
这样扩展就会停止。
例如,我假设上面可以\quad
扩展,但如果你想将其保留为\quad
添加
\MakeRobust\quad
然后日志显示序言
> \mymath=macro:
->\protect \[ (2) \protect \quad a + b = x.\protect \] .
l.21 \show\mymath
?
> \mymath=macro:
->\protect \[ (3) \protect \quad a + b = \protect \mathbf {x}. \protect \] .
l.27 \show\mymath