如何在方程式环境中忽略结束标点符号?

如何在方程式环境中忽略结束标点符号?

我使用以下方法将长文档中的所有方程式导出为单独的 pdf(随后导出 png 文件):

\documentclass{article}
\newif\ifexport
%\exporttrue
\ifexport
    \RequirePackage{mathtools}
    \mathtoolsset{showonlyrefs}
    \RequirePackage[active,tightpage]{preview}
    \PreviewEnvironment{equation}
    \PreviewEnvironment{equation*}
    \PreviewEnvironment{align}
\else\fi
\begin{document}
    My equations may be part of a sentence, such as 
    \begin{equation}
        x = y.
    \end{equation}

    But when exporting them (\verb|\exporttrue|), I would like to discard the punctuation: the previous equation should look exactly like this one:
    \begin{equation}
    x = y
    \end{equation}

    Is that possible? 
\end{document}

我的方程式可能是句子的一部分,但在导出它们时\exporttrue,我想丢弃标点符号。可以吗?

答案1

转变

已经有一个开关,\ifexport可以使用:

x = y\ifexport\else.\fi

或者可以定义一个宏,取决于开关\ifexport

\documentclass{article}
\newif\ifexport
%\exporttrue
\ifexport
    \RequirePackage{mathtools}
    \mathtoolsset{showonlyrefs}
    \RequirePackage[active,tightpage]{preview}
    \PreviewEnvironment{equation}
    \PreviewEnvironment{equation*}
    \PreviewEnvironment{align}
    \newcommand*{\textpunct}[1]{}
\else
    \newcommand*{\textpunct}[1]{#1}
\fi
\begin{document}
    My equations may be part of a sentence, such as
    \begin{equation}
        x = y\textpunct{.}
    \end{equation}
\end{document}

有效的数学标点符号

没有简单的方法可以检测等式末尾的标点符号。因此,以下示例假设标点符号仅出现在\end\end{equation}、、、 ...)之前。然后\end{gather}\end{align}该示例在数学模式下激活句号和逗号以提前查找\end

\documentclass{article}
\newif\ifexport
\exporttrue
\ifexport
    \RequirePackage{mathtools}
    \mathtoolsset{showonlyrefs}
    \RequirePackage[active,tightpage]{preview}
    \PreviewEnvironment{equation}
    \PreviewEnvironment{equation*}
    \PreviewEnvironment{align}
    \newcommand*{\mathperiod}{}
    \mathchardef\mathperiod=\mathcode`\.
    \newcommand*{\mathcomma}{}
    \mathchardef\mathcomma=\mathcode`\,
    \begingroup
      \makeatletter
      \lccode`\~=`\.
      \lowercase{\gdef~{\@ifnextchar\end{}\mathperiod}}
      \lccode`\~=`\,
      \lowercase{\gdef~{\@ifnextchar\end{}\mathcomma}}
    \endgroup
    \AtBeginDocument{%
        \mathcode`\.="8000\relax
        \mathcode`\,="8000\relax
    }%
\fi
\begin{document}
    My equations may be part of a sentence, such as
    \begin{equation}
        x.z = y.
    \end{equation}
\end{document}

答案2

这是一个基于 LuaLaTeX 的解决方案。它将指令添加\directlua{do_something=true}到子句中\ifexport,并提供一个名为的 Lua 函数remove_trailing_punct,如果\ifexport为“真”,则会删除出现在结束equation[*]和环境中的行align[*]。逗号、句号(“句号”)和分号是从行尾删除的标点符号。该代码既适用于以 结尾的行\\(即,alignalign*环境中的行),也适用于仅以标点符号结尾的行。

如果您不熟悉 LuaLaTeX:由于它(在很大程度上)是 pdfLaTeX 的超集,因此您无需对代码进行太多更改即可让您的文档在 LuaLaTeX 下进行编译。只需 (a) 将代码块从 复制到 到\usepackage{luacode}序言\end{luacode}的顶部,(b) 加载fontspec包(如下例所示),以及 (c) 避免加载fontencinputenc包。真的就这些了。


在此处输入图片描述


在此处输入图片描述


% !TEX TS-program = lualatex
\documentclass{article}
\usepackage{fontspec}
\usepackage{mathtools,unicode-math}

\usepackage{luacode}
\begin{luacode}
do_something    = false
in_display_math = false  
function remove_trailing_punct ( buff )
if do_something == true then
   if string.find ( buff , "\\begin{equation%*?}" ) or
      string.find ( buff , "\\begin{align%*?}" ) then
        in_display_math = true
   elseif string.find ( buff , "\\end{equation%*?}" ) or
          string.find ( buff , "\\end{align%*?}" ) then
        in_display_math = false
   elseif in_display_math == true then
        buff = string.gsub ( buff , "^(.+)%s-[%.%,%;]%s-(\\\\)%s-$" , "%1".."%2" )
        buff = string.gsub ( buff , "^(.+)%s-[%.%,%;]%s-$" , "%1" )
  end
end
return buff
end
luatexbase.add_to_callback ( "process_input_buffer", 
     remove_trailing_punct, "remove_trailing_punct" )
\end{luacode}

\newif\ifexport
\exporttrue
\ifexport
    \mathtoolsset{showonlyrefs}
    \RequirePackage[active,tightpage]{preview}
    \PreviewEnvironment{equation}
    \PreviewEnvironment{equation*}
    \PreviewEnvironment{align}
    \PreviewEnvironment{align*}
    \directlua{ do_something = true }
\fi

\begin{document}
    \begin{align*}
        a/b &= c , \\
        u*v &= w . 
    \end{align*}

    \begin{equation*}
        x+y = z  .   
    \end{equation*}
\end{document}

相关内容