1. TeX 数学移位

1. TeX 数学移位

comment.sty 包允许排版

\begin{comment}
stuff that will be suppressed from output file
\end{comment}

或者

\begin{myCustomEnv}
stuff that will be suppressed from output file
\end{myCustomEnv}

我们甚至可以抑制已经定义的环境的内容,例如{proof}

本着这种精神,我想抑制数学模式中的所有内容,无论它以何种方式开始:,,,,$等等。输出应该就像数学模式中的所有内容都不在源文件中一样\($$\begin{displaymath}

这能做到吗?

答案1

进入和退出数学模式有几种非常不同的方法:

  1. TeX 数学移位字符,catcode 3,通常$
  2. LaTeX 宏\(<math>\)\[<math>\]
  3. LaTeX 环境mathdisplaymath
  4. amsmath环境
  5. 不是直接在源中:使用原始 catcode 定义的宏$无法用所描述的方法隐藏。

1. TeX 数学移位

轻松重新定义$(catcode 13, active) 即可解决这个问题。

\catcode`$=\active
\makeatletter
\def${%                        % TeX math shift (not anymore)
    \@ifnextchar${\killB}{\killA}%
}
\makeatother
\def\killA#1${\ignorespaces}   % TeX inline math
\def\killB$#1$${\ignorespaces} % TeX display math

该宏通过删除最后一个 之后的所有空格来\killA终止内联数学 ( ) 。如果没有,类似的内容将被排版为。 (这将被禁止“输出应该像数学模式中的所有内容不在源文件中一样。”)$<math>$$\ignorespacesText $ f(x) $ textText␣␣text

2. LaTeX 宏\(<math>\)\[<math>\]

这些宏的 TeX 重新定义就足够了:

\def\(#1\){\ignorespaces} % LaTeX inline math
\def\[#1\]{\ignorespaces} % LaTeX display math

如果没有空白问题(见上文),下面的方法也可以起作用:

\let\[\iffalse
\let\]\fi
\let\(\iffalse
\let\)\fi

3. LaTeX 环境mathdisplaymath

LaTeX 环境mathdisplaymath内部使用$\[\],但上述解决方案在这里不起作用(它们反而会带来更大的危害)。

但是在该包的帮助下,environ我们可以简单地重新定义这些环境:

\def\killMe#1{%                % for math environments
    \expandafter\let\csname #1\endcsname\relax
    \expandafter\let\csname end#1\endcsname\relax
    \NewEnviron{#1}{}%
    }

\killMe{displaymath}
\killMe{math}

宏的前两行\killMelet\<environment>\end<environment>to\relax认为\NewEnviron它们尚未定义。会自动在环境的一部分中\NewEnviron插入一个。\ignorespaces\end

4.amsmath环境

amsmath软件包提供了一些与宏相同的“静音”环境\killMe。例如:

\killMe{align}
\killMe{align*}

代码

\documentclass{article}
\usepackage{amsmath}
\usepackage{environ}

\def\killMe#1{%                      for math environments
    \expandafter\let\csname #1\endcsname\relax
    \expandafter\let\csname end#1\endcsname\relax
    \NewEnviron{#1}{}%
}

    \def\(#1\){\ignorespaces}%        LaTeX inline math
    \def\[#1\]{\ignorespaces}%        LaTeX display math

%   \let\[\iffalse
%   \let\]\fi
%   \let\(\iffalse
%   \let\)\fi

    \catcode`$=\active
    \makeatletter
    \def${%                            TeX math shift
        \@ifnextchar${\killB}{\killA}%
    }%
    \makeatother
    \def\killA#1${\ignorespaces}%     TeX inline math
    \def\killB$#1$${\ignorespaces}%   TeX display math

    \killMe{align}%
    \killMe{align*}%
    \killMe{displaymath}%              displaymath relies on \[ and \] and cannot live
    %                                  without the right definition of \[ and \]
    \killMe{math}%      %              math relies on $ as math shift character and would work
    %                                  although $ is active and redefined


\begin{document}
H%
$ i^n TeX $
e%
\( i^n LaTeX \)
l%
$$ o^ut TeX $$
l%
\[ o^ut LaTeX \]
o
\begin{align}
 f(x) & = x^2
\end{align}
W%
\begin{align*}
 f(x) & = x^2
\end{align*}
o%
\begin{displaymath}
 f(x) = x^2 (displaymath)
\end{displaymath}
r%
\begin{math}
    2^3 (math)
\end{math}
ld!

Text $ f(x) $ text
\end{document}

输出

在此处输入图片描述

答案2

我还建议采用一些外部解决方案,从文件中删除数学材料并写入新材料。其中一个原因是 LaTeX 内部在很多不明显的地方使用数学(不一定是真正的数学),\LaTeXe例如徽标。

无论如何,只是为了好玩,这里有一个 LaTeX 内的解决方案(完全不受支持并且不一定完整,也许必须禁用更多功能):

\documentclass{article}

\makeatletter
\def\nomath{%
\font\dummyft@=dummy \relax
   \count@\sixt@@n
   \loop
    \ifnum\count@ >\z@
     \advance\count@\m@ne
     \global\textfont\count@\dummyft@
     \global\scriptfont\count@\dummyft@
     \global\scriptscriptfont\count@\dummyft@
    \repeat
   \global\let\mathversion\@gobble
   \frozen@everymath={}
   \frozen@everydisplay={}
  \let\boldmath\relax
  \let\unboldmath\relax
  \let\mv@normal\@empty
  \let\mv@bold\@empty
}
\makeatother

\begin{document}
test1: $x$

test2:
\[ a=b\]

test3: \LaTeX{} and $a=b$ but see:  \LaTeXe

\begin{itemize} \item test4 $a=b$ \end{itemize}

test5:  \parbox[c]{1cm}{now what? $a=b$}

\bigskip

\nomath \ldots{} and again \ldots

test1: $x$

test2:
\[ a=b\]

test3: \LaTeX{} and $a=b$ but see:  \LaTeXe

\begin{itemize} \item test4 $a=b$ \end{itemize}

test5:  \parbox[c]{1cm}{now what? $a=b$}
\end{document}

但对于示例文档,它似乎确实成功抑制了所有数学运算(或多或少)。请注意,我做了一些非常讨厌的事情,例如更改\frozen@everymath,由于某种原因被冻结,但你还是这么做了。

还请注意结果输出中的缺陷:

在此处输入图片描述

答案3

(我知道 OP 在评论中说过他们不再需要这个,但是它又回到了网站首页,而我第一次错过了它。)

前段时间,我写了一个程序,用于在 LaTeX 文档中查找数学部分。它并不完美,但它比简单的脚本要好一些。

您可以在以下位置找到它(及其限制)https://github.com/loopspace/mathgrep

答案4

这是从文件创建无数学输出的简单方法,LaTeX方法是从该文件中删除所有数学代码。别忘了保留原始文件的未更改副本!

LaTeX使用编辑器中的替换功能编辑文件Regular Expressions,例如Kate。正则表达式

\$((.|\n)(?!\$))*(.|\n)\$

找到内联数学,但会补偿贪婪,也就是说,它会在代码中保留单词andimplies原封不动LaTeX

$x=y$ and $y=z$ implies $x=z$.

(在其他编辑器中,更简单的正则表达式\$.+?\$可能会起作用。)

要查找类似的其他数学环境equation*,只需将第一个替换\$\\begin\{equation\*\},将第二个和第三个替换\$\\end\{equation\*\}

相关内容