我对bash脚本还比较陌生,对LaTeX没有任何经验。我被要求开发一个脚本,它将用更繁琐的长格式等价物取代LaTeX文档中的方便快捷方式。
到目前为止,我的方法是在单独的变量中隔离快捷形式和长形式,然后尝试使用sed在文本中替换它们。我在下面附上了一些简短的示例文件。
目前,脚本有两个参数,一个是文件expr,它从中检索快捷方式和长格式术语,另一个是infile,应该对其进行适当的更改。我知道这个脚本正确地隔离了快捷方式和长格式,并且可以返回它们,但它似乎无法执行sed命令。
我试着在网上搜索了一下,发现了多个类似的问题,其中建议sed很难识别变量,各种类型的报价组合可能会解决这个问题。我试过很多种排列,但似乎都不起作用。在许多情况下,长格式术语包含特殊字符,如"$"one_answers"{}",所以我怀疑这可能是问题所在,但我不确定。关于如何解决这个问题,我也对其他想法持开放态度。请在下面找到脚本和两个参数文件(expr和infile)的示例。
包含快捷方式和长格式的expr文件
% a
newcommand{ao}{$^{18}$O}
newcommand{aodso}{$^{18}$O/$^{16}$O}
% b
newcommand{bea}{begin{equation}}
newcommand{beaa}{begin{eqnarray}}
% c
newcommand{cthree}{C$_3$}
newcommand{cfour}{C$_4$}
newcommand{coz}{CO$_2$}
包含要用长格式替换的快捷方式的内野文件
This is my test {ao}
{aodso} my test is this
Does it work {bea}
{beaa} test test test
work work work {cthree}
{cfour} This is my test
my test is this {coz}
以expr和infile为自变量调用的脚本的相关子段
while read line; do
if [[ $line == newcommand* ]]; then
temp=${line#*{}
sc=${temp%%}*}
templf=${temp#*{}
lf=${templf%}}
#echo $sc, $lf
sed -i -e 's/${sc}/${lf}/g' ${infile}
fi
done < ${expr}
更新:为了澄清,这就是想要的结果,内野中的捷径将被适当的长形式取代
This is my test {$^{18}$O}
{$^{18}$O/$^{16}$O} my test is this
Does it work {begin{equation}}
{begin{eqnarray}} test test test
work work work {C$_3$}
{C$_4$} This is my test
my test is this {CO$_2$}
GNU sed代码:
sed -r '/^%/d;s#.*b({\w+})({.*})#1 2#;s#\#\\#g;s#(S+)s(S+)#\|1|s|1|2|g#' file1|sed -f - file2
$cat文件1%a\新命令\新命令%b\newcommon{\bea}{\begin{equation}}\newcommand{\beaa}{\bbegin{eqnarray}}%c\新命令{\ct三}{C$_3$}\新命令{\cf our}{C$_4$}\newcommand{\coz}{CO$_2$}$cat文件2这是我的测试我的测试是这个它有效吗{\bea}测试测试工作这是我的测试我的测试是这个$sed-r"/^%/d;s#.*\b(\{\\w+\}这是我的测试{$^{18}$O}{$^{18}$O/$^{16}$O}我的测试是它起作用吗{\begin{eqnarray}}测试测试工作工作{C$_3$}{C$_4$}这是我的测试我的测试是这个{CO$_2$}
说明:
对sed
有两个调用,第一个调用从具有搜索/替换模式的文件中生成sed
脚本:
sed-r'/^%/d;s#.*\b(\{\\\\w+\};s#\\\#\\\#g;文件1\|{\\ao}|s|{\\ao}|{$^{18}$O}|g\|{\\aodso}|s|\|{\bea}|s|{\bia}|{\\begin{equation}}|g\|{\\beaa}|s|{\\beaa}|{\\ begin{eqnarray}}|g\|{三个}|s|{三}|{C$_3$}|g\|{\\cfour}|s|{\\cfgour}|{C$_4$}|g\|{\\coz}|s|{\\coz}|{CO$_2$}|g
在第二个调用中,sed
用文本文件处理该脚本以进行替换。
sed -f - file2
在tex.SE上有很多关于这个问题的讨论。但我要借此机会指出,那里(IMO)的最佳答案是使用de-macro
程序,这是TeXLive附带的python脚本。它功能强大,可以处理参数以及简单的替换。
要使用它,请将要展开的宏移动到<something>-private.sty
文件中,并使用usepackage{<something>-private}
将其包含在文档中,然后运行de-macro <mydocument>
。它吐出了<mydocument>-private.tex
,它与您原来的一样,但您的私有宏被它们更基本的东西所取代。
我知道这个问题很长一段时间以来就被标记为已回答,并且您明确提到bash和sed是您想要的工具。
然而,为了其他人的利益,如果你不坚持使用bash和sed,那么你的问题还有其他选择,例如perl脚本TME(正如SO中建议的那样)。用法:
tme [ -c ] [ -D | -Dn ] [ macros.tex ... ] <input.tex >output.tex