找到确切的[ 0 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17]
对,并将其更改为equation (begin and end)
,其中找到了align (begin and end)
代码。
<check>
my $str = '
\begin{equation}
v_{i}(t)=M\xi_{l}^{-1}(\Vert z^{0}\Vert_{\infty}+\varepsilon)\xi_{i}e^{\gamma t},\quad t\geq 0.\label{eq:2.3}
\end{equation}
\begin{equation}
v_{\kappa}(q_{\kappa j}t)=M\xi_{l}^{-1}(\Vert z^{0}\Vert_{\infty}+\varepsilon)\xi_{\kappa}e^{\gamma q_{\kappa j}t}= v_{\kappa}(t)e^{-\gamma (1-q_{\kappa j})t}\leq v_{\kappa}(t).\label{eq:2.4}
<check>
\end{equation}
\begin{equation}
|z_{i}(0)|\lt\xi_{l}^{-1}(\Vert z^{0}\Vert_{\infty}+\varepsilon)\xi_{i} \leq M\xi_{l}^{-1}(\Vert z^{0}\Vert_{\infty}+\varepsilon)\xi_{i}= v_{i}(0), i\in J.\label{eq:2.5}
<check>
\end{equation}
\begin{equation}
|z_{i}(t) | \lt v_{i}(t)\quad \mbox{for all } t \in (0, T],\ i\in J.\label{eq:2.6}
\end{equation}';
我的检查方法是找到while( $str =~ m/\\begin\{((?:[^{}]*)\*?)\}((?:(?!\\end\{\1\}).)*)<check>((?:(?!\\end\{\1\}).)*)\\end\{\1\}/sgi ) {
print "Found: $&\n";
}
到\begin{}
,找到\end{}
元素,
然后将<check>
更改为equation
。如果方程式超过1000,则该工具消耗太多时间来检查每个方程。因此需要检查另一种方式。
我可以这样做吗?
align
元素<check>
之前\begin{equation}
\begin{align}
\end{equation}
我认为有可能。
答案 0 :(得分:2)
到目前为止最简单的方法是将整个文件放入并找到整个方程式
perl -0777 -wpe'
s[ \\begin{equation} (.*? <check> .*?) \\end{equation} ]
[ \\begin{align} $1 \\end{align} ]gsx
' file.tex > changed_file.tex
当匹配失败时,不进行替换,因此无需先找到匹配项。使用-p
当前“行”($_
,此处的整个文件)将被打印,更改或不更改,因此我们处理整个文件。
.*?
与第一个<check>
匹配,然后第二个.*?
匹配从第一个\end{equation}
开始。那里可能有更多<check>
个标签,但这与我们无关,因为它们无需识别。只要等式中有任何一个,就可以进行替换。
Latex/Tex
文档不太可能太大而无法立即处理。
另一种方法是将标记保留在感兴趣的元素上,一旦检测到<check>
标记,就更改它们。您可以在阅读时使用文件行填充单独的数组,以避免在文件中来回seek
并更改其元素。最后输出该数组作为已处理文件。