编辑

编辑

我计划编写一个软件包来为视障人士改编文档。我希望所有功能都可以立即使用,不受用户习惯或类别的影响,只需使用\usepackage{my-package},无需改编文档的 latex 代码。

对于某些视障人士来说,需要进行的调整之一是将所有内容(包括方程式)移到左侧。

对于使用环境创建的显示数学方程式amsmath,我计划使用fleqnleqno选项

\PassOptionsToPackage{fleqn, leqno}{amsmath}
\RequirePackage{amsmath}

而且由于我不确定是否amsmath已经在我的包之前加载,所以我将强制进行一些设置:

\tagsleft@true
\@fleqntrue
\let\mathindent=\@mathmargin
\@mathmargin\leftmargini minus\leftmargini

我测试了许多显示环境:\[...\],,,和;这有效。displaymathequationaligngather

问题出在$$...$$公式上。我知道\[...\] 优于 $$...$$但有些用户仍然使用双美元来编写公式。更糟糕的是,他们中的一些人可能混淆了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}

请注意,这是非常不支持:内部可能会改变,我们可能会修改我们的抓取方式等。使用风险自负!

相关内容