在文档末尾内联数学

在文档末尾内联数学

有没有办法让所有的内联数学即,TeX 文件中用 $...$ 和 \(...\) 括起来的方程式应该像 endfloat 功能一样打印在文档末尾。

答案1

在普通的 TeX 中,我们可以使用\everymath原始寄存器:

\def\eqlist{}
\def\collectedequations{\everymath={}
   \ifx\eqlist\empty no equations\else \eqlist \fi}
\everymath={\savemath}
\def\savemath#1${#1$\global\addto\eqlist{$#1$\par}}
\long\def\addto#1#2{\expandafter\def\expandafter#1\expandafter{#1#2}}


A test $a^2=aa$ and $a^3=aaa$ and $a+b+c=42$.

\collectedequations

\bye

答案2

谨防建议以下方法\everymath

\def\eqlist{}
\def\collectedequations{\everymath={}
   \ifx\eqlist\empty no equations\else \eqlist \fi}
\everymath={\savemath}
\def\savemath#1${#1$\global\addto\eqlist{$#1$\par}}
\long\def\addto#1#2{\expandafter\def\expandafter#1\expandafter{#1#2}}

$0=0$

a\footnote{b}

\collectedequations

\bye

在这个例子中,运行 tex 会引发相当神秘的错误消息

Runaway argument?
! Paragraph ended before \next was complete.
<to be read again>
                   \par
l.11

假设您可以使用 LaTeX\(...\)并进行适当的重新定义。

\documentclass{article}

\ExplSyntaxOn

\seq_new:N \g__rampsmart_formulas_seq

\RenewDocumentCommand{\(}{}
 {
  \rampsmart_collectmath:w
 }

\cs_new_protected:Npn \rampsmart_collectmath:w #1 \)
 {
  \seq_gput_right:Nn \g__rampsmart_formulas_seq { $#1$ }
  $#1$
 }

\NewDocumentCommand{\printformulas}{+m}
 {
  \cs_set:Nn \__rampsmart_collectmath_print:nn { #1 }
  \seq_map_indexed_function:NN \g__rampsmart_formulas_seq \__rampsmart_collectmath_print:nn
 }

\ExplSyntaxOff

\begin{document}

\section{Text}

\(0=0\) is true; to the contrary, \(0=1\) is false.
\[
x(yz)=x(yz)
\]

\section{Formulas}

Here are all the formulas:

\printformulas{#1. #2\par}

\section{Again}

In a different format:
\begin{enumerate}
\printformulas{\item #2}
\end{enumerate}

\end{document}

参数\printformulas是要使用的模板:#1代表序列号,#2代表实际公式。

在此处输入图片描述

按照 Yiannis 的邀请,这里有一个示例,说明如何使用模板中的两个参数来获取超链接。

\documentclass{article}
\usepackage{hyperref}

\ExplSyntaxOn

\seq_new:N \g__rampsmart_formulas_seq

\RenewDocumentCommand{\(}{}
 {
  \rampsmart_collectmath:w
 }

\cs_new_protected:Npn \rampsmart_collectmath:w #1 \)
 {
  \seq_gput_right:Nn \g__rampsmart_formulas_seq { $#1$ }
  \hypertarget{cf@\seq_count:N \g__rampsmart_formulas_seq}{$#1$}
 }

\NewDocumentCommand{\printformulas}{+m}
 {
  \cs_set:Nn \__rampsmart_collectmath_print:nn { #1 }
  \seq_map_indexed_function:NN \g__rampsmart_formulas_seq \__rampsmart_collectmath_print:nn
 }

\NewDocumentCommand{\formulalink}{mm}
 {
  \hyperlink{cf@#1}{#2}
 }

\ExplSyntaxOff

\begin{document}

\section{Text}

\(0=0\) is true. \newpage

To the contrary, \(0=1\) is false.
\[
x(yz)=x(yz)
\]

\section{Formulas}

Here are all the formulas:

\printformulas{#1. #2\par}

\section{Hyperlinks}

\begin{enumerate}
\printformulas{\item \formulalink{#1}{#2}}
\end{enumerate}

\end{document}

根据我们存储公式的序列中的当前项目数为目标赋予一个名称,因此我们可以使用索引来定义超链接。

在此处输入图片描述

答案3

这是一个简短的解决方案,适用于\(......\)

\documentclass{article}
\ExplSyntaxOn
\clist_new:N\inline_math_store_clist
\long\def\(#1\){\begingroup
\clist_put_right:Nn\inline_math_store_clist{#1}
$#1$
}%
\def\){\endgroup}%
\def\collectedequations{
\clist_map_inline:Nn\inline_math_store_clist{
  \math##1\endmath\par
}}  
\ExplSyntaxOff
\begin{document}

A test \(a^2=aa\) and \(a^3=aaa\) and \( a+b+c=42\)

\collectedequations
\end{document}

答案4

感谢 @Wipet 和 @Yiannis,你们的意见真的帮助我找到了这个请求的解决方案。然后,@Circumscribe 从链接中讨论了解决方案自动列出文档中的所有方程式也有助于实现整体。我在下面提供了针对 LaTeX 文件的代码更改。

\documentclass{文章}

\usepackage{etoolbox}

\newbox\savedeqs
\newbox\inlinemath
\newbox\unnummath
\newbox\inlineparen
\newbox\unnumparen
\newwrite@mathfile

\newcommand\saveandprinteq[1]{%
\begingroup
\expandafter\let\csname @currenvir\expandafter\endcsname\csname listeq@@currenvir\endcsname
\expandafter\let\csname end@currenvir\expandafter\endcsname\csname listeq@end@currenvir\endcsname
\edef\listeq@temp{%
\noexpand\begin{@currenvir}%
\unexpanded{#1}%
\noexpand\end{@currenvir}%
}%
\savecounters@%
\global\setbox\savedeqs=\vbox{\unvbox\savedeqs\listeq@temp}%
\restorecounters@%
\listeq@temp%
\endgroup}

\newcommand*\listeqpatch[1]{% %% <- 补丁方程环境
\expandafter\let\csname listeq@#1\expandafter\endcsname\csname #1\endcsname
\expandafter\let\csname listeq@end#1\expandafter\endcsname\csname end#1\endcsname
\renewenvironment{#1}{\collect@body\saveandprinteq}{}}

\begingroup
\catcode`$=\active
\protected\gdef${@ifnextchar$@doubledollar@singledollar}
\protected\gdef@doubledollar$#1$${\edef\listueq@temp{\detokenize{$$#1$$}}%
\savecounters@%
\global\setbox\unnummath=\vbox{\unvbox\unnummath\listueq@temp}%
\restorecounters@%
\protected@write@mathfile{}{\listueq@temp}}
\protected\gdef@singledollar#1${\edef\listieq@temp{\detokenize{$#1$\par}}%
\savecounters@%
\global\setbox\inlinemath=\vbox{\unvbox\inlinemath\listieq@temp}%
\restorecounters@%
\protected@write@mathfile{}{\listieq@temp}}
\protected\gdef(#1){
\edef\listipeq@temp{\detokenize{$#1$\par}}%
\savecounters@%
\global\setbox\inlineparen=\vbox{\unvbox\inlineparen\listipeq@temp}%
\restorecounters@%
\protected@write@mathfile{}{\listipeq@temp}}%
\protected\gdef[#1]{
\edef\listupeq@temp{\detokenize{$$#1$$}}%
\savecounters@%
\global\setbox\unnumparen=\vbox{\unvbox\unnumparen\listupeq@temp}%
\restorecounters@%
\protected@write@mathfile{}{\listupeq@temp}}
\endgroup

\AtBeginDocument{%
\immediate\openout@mathfile=\jobname-MathFile.tex
\catcode`$=\active}

\newcommand\listofequations{%
\immediate\closeout@mathfile%
\catcode`$=3%
\clearpage%
\pagestyle{empty}%
\textbf{\Large List of Equations}\vskip10pt
\input \jobname-MathFile.tex%
\unvbox\savedeqs}

%% 修补方程环境
\listeqpatch{gather}
\listeqpatch{alignat}
\listeqpatch{xalignat } \
listeqpatch{align}
\listeqpatch{flalign}
\listeqpatch{equation}
\listeqpatch{eqnarray}
\listeqpatch{multline}
\listeqpatch{gather*}
\listeqpatch{alignat*}
\listeqpatch{xalignat*}
\listeqpatch{align*}
\listeqpatch{flalign*}
\listeqpatch{equation*}
\listeqpatch{eqnarray*}
\listeqpatch{multline*}

\开始{文档}

$a+b=0$

\(cd=0\)

$$a+b=0$$

\[cd=0\]

\开始{方程}
a+b=0
\结束{方程}

... ... ...

\方程列表

\结束{文档}

相关内容