lwarp 中的数学(通过控制扩展?)

lwarp 中的数学(通过控制扩展?)

这是我正在考虑的问题以及一些可能的方法。当使用 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}

(1)a + x =(红色文本)\xyz,\bfxyz;(2)a + b = x;(3)a + b =(粗体)x

使用 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

相关内容