我使用以下方法将长文档中的所有方程式导出为单独的 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[*]
。逗号、句号(“句号”)和分号是从行尾删除的标点符号。该代码既适用于以 结尾的行\\
(即,align
或align*
环境中的行),也适用于仅以标点符号结尾的行。
如果您不熟悉 LuaLaTeX:由于它(在很大程度上)是 pdfLaTeX 的超集,因此您无需对代码进行太多更改即可让您的文档在 LuaLaTeX 下进行编译。只需 (a) 将代码块从 复制到 到\usepackage{luacode}
序言\end{luacode}
的顶部,(b) 加载fontspec
包(如下例所示),以及 (c) 避免加载fontenc
和inputenc
包。真的就这些了。
% !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}