我计划编写一个软件包来为视障人士改编文档。我希望所有功能都可以立即使用,不受用户习惯或类别的影响,只需使用\usepackage{my-package}
,无需改编文档的 latex 代码。
对于某些视障人士来说,需要进行的调整之一是将所有内容(包括方程式)移到左侧。
对于使用环境创建的显示数学方程式amsmath
,我计划使用fleqn
和leqno
选项
\PassOptionsToPackage{fleqn, leqno}{amsmath}
\RequirePackage{amsmath}
而且由于我不确定是否amsmath
已经在我的包之前加载,所以我将强制进行一些设置:
\tagsleft@true
\@fleqntrue
\let\mathindent=\@mathmargin
\@mathmargin\leftmargini minus\leftmargini
我测试了许多显示环境:\[...\]
,,,和;这有效。displaymath
equation
align
gather
问题出在$$...$$
公式上。我知道\[...\] 优于 $$...$$但有些用户仍然使用双美元来编写公式。更糟糕的是,他们中的一些人可能混淆了amsmath
环境和$$
。
我$$...$$
设法用
\def\leftdisplay#1$${\leftline{\indent$\displaystyle{#1}$}$$}
\everydisplay{\leftdisplay}
在 TeXbook 中采用(练习 19.4 的答案)。但它与amsmath
显示环境不兼容,并会产生错误:
Paragraph ended before \leftdisplay was complete.
Missing $ inserted.
Display math should end with $$.
\noexpand
我做的最好的事情就是在之前添加\leftdisplay
。这可以抑制错误,但$$...$$
不会再刷新到左边。
那么,是否有可能将所有显示方程式向左刷新,无论它们是用$$...$$
还是amsmath
环境创建的?
我现在的位置是:
\documentclass{article}
\usepackage[fleqn, leqno]{amsmath}
\def\leftdisplay#1$${\leftline{\indent$\displaystyle{#1}$}$$}
\everydisplay{\noexpand\leftdisplay}
\begin{document}
$$ double~dollars $$
\[
brackets
\]
\begin{displaymath}
displaymath~env
\end{displaymath}
\begin{equation}
\label{eq:equation}
equation~env
\end{equation}
\begin{align}
\label{eq:align}
align
\end{align}
\begin{gather}
\label{eq:gather}
gather
\end{gather}
\end{document}
编辑
从 David Carlisle 的评论中我明白,如果不冒破坏其他东西的风险,这是不可能的。然后我将放弃我的请求并为仍在使用的恶意用户实现一个选项$$
(文档中劝告改用\[...\]
- 但谁会读文档?)。
答案1
虽然我强烈建议不要这样做,但为标记而开发的代码需要处理“原始”数据$$
(因为 arXiv 上有数百万份文档,而且相当一部分文档会使用它,尽管 LaTeX 从未支持过它)。因此,我们可以使用标记代码的内部代码来进行调整
\DocumentMetadata{testphase = {math}}
\documentclass{article}
\usepackage[fleqn, leqno]{amsmath}
\ExplSyntaxOn
\cs_gset_protected:Npn \__math_grab_dollardollar:w % $$
#1 $$
{
\tl_if_blank:nF {#1}
{
\__math_process:nn { equation* } {#1}
\socket_use:n {tagsupport/math/display/begin}
\socket_use:nn{tagsupport/math/display/formula/begin}
{ \leftline{$\indent\displaystyle{#1}$} }
$$
}
}
\ExplSyntaxOff
\begin{document}
$$ double~dollars $$
\[
brackets
\]
\begin{displaymath}
displaymath~env
\end{displaymath}
\begin{equation}
\label{eq:equation}
equation~env
\end{equation}
\begin{align}
\label{eq:align}
align
\end{align}
\begin{gather}
\label{eq:gather}
gather
\end{gather}
\end{document}
请注意,这是非常不支持:内部可能会改变,我们可能会修改我们的抓取方式等。使用风险自负!