MathJax多行内联公式垂直对齐自定义命令需求问询
我之前也遇到过类似的问题,根源在于你在行内公式里用了align这个display级别的环境——MathJax默认会把这类块级公式垂直居中对齐文本基线,单行公式因为高度小,看起来对齐正常,但多行就会明显偏移。下面给你几个通用的解决方案,不用每次估算偏移值:
方案1:用aligned环境+精准基线调整
首先换成专门用于行内的aligned环境,配合t参数让它顶部对齐,再结合TeX的\strutbox(当前行的标准基线盒)来精准调整:
$\raisebox{-\dp\strutbox}{$\begin{aligned}[t]2 \cdot x &= 8\\x &=\end{aligned}$}$
这里\dp\strutbox是当前字体基线下方的深度,用它来向上偏移公式,能完美对齐文本基线,不管字体尺寸是rem还是其他单位,都不会有偏差。
如果你觉得上面的写法有点繁琐,也可以简化成:
$\begin{aligned}[t]2 \cdot x &= 8\\x &=\end{aligned}$
默认的t选项已经能让公式顶部对齐文本,多数场景下效果足够好,只有当公式底部有下沉元素(比如下标)时,才需要额外加\raisebox调整。
方案2:自定义全局命令(一劳永逸)
要是你经常需要这种对齐方式,可以在MathJax的配置里定义一个自定义命令,以后直接调用就行:
在你的页面MathJax配置脚本中添加这段代码:
MathJax.Hub.Register.StartupHook("TeX Jax Ready", function () { const TEX = MathJax.InputJax.TeX; TEX.Definitions.Add({ macros: { valignalign: ['Macro', '', function (parser, name) { const alignContent = parser.ParseArg(name); return TEX.Parse(`\\raisebox{-\\dp\\strutbox}{$\\begin{aligned}[t]${alignContent}\\end{aligned}$}`, parser.stack.env); }] } }); });
之后你就能像这样轻松使用:
$\valignalign{2 \cdot x &= 8\\x &=}$
所有用这个命令的多行公式都会自动和文本基线对齐,完全不用手动调整数值。
方案3:全局CSS适配(不修改公式代码)
如果你不想改动任何公式代码,也可以用CSS全局调整行内多行公式的对齐方式。给页面添加以下样式:
/* 全局让所有行内公式对齐基线 */ .mjx-chtml[display="false"] .mjx-math { vertical-align: baseline !important; }
要是你需要区分部分公式(比如有些还是要居中),可以给需要对齐的公式外层加个类名,比如valign-formula,然后调整CSS:
.valign-formula .mjx-chtml[display="false"] .mjx-math { vertical-align: baseline !important; }
使用时包裹公式即可:
<span class="valign-formula">$\begin{align}2 \cdot x &= 8\\x &=\end{align}$</span>
为什么之前的方法效果不好?\raise -.6em用固定像素/相对单位会因为字体、公式高度不同产生偏差,而\strutbox是基于当前字体的标准盒,适配性更强;vertical-align: text-top只是对齐文本顶部,不是基线,所以和周围文本的对齐感会很差。
内容的提问来源于stack exchange,提问作者LGT

