是否可以制作(Perl或在Mac OS X上运行的任何内容)脚本转换
\section{long text}
\sectionmark{short text}
到
\section[long text]{long text\sectionmark{short text}}
或替代
\section{long text}[short text]
我无法确保long text
中没有换行符,或\section
与\sectionmark
之间是否有中断。
此问题与here和TeX.SX。
讨论的问题有关答案 0 :(得分:2)
awk '/\\section{long text}/ { oldline=$0
getline
gsub("{","[",oldline)
gsub("}","]",oldline)
print gensub("(.*)\\[(.*)\\]","\\1[\\2]{\\2","g",oldline) $0 "}"
getline
}
1' INPUTFILE
如果long text
中没有换行符且\section
和\sectionmark
之间没有空行,则会为您执行此操作。如果你有任何这些,你仍然可以修改它。
所以回答你的问题:是的,这是可能的。
<强>更新强>
这是一个有效的解决方案,awk
:
awk '/\\section{/ { oldline=$0
if ( oldline ~ /}/ ) {
lt=gensub(".*{([^}]+)}.*","\\1","g",oldline)
} else {
lt=gensub(".*{(.*)","\\1","g",oldline)
getline tmp
while ( tmp !~ "}" ) {
lt=lt "\n" tmp
getline tmp
}
lt=lt "\n" gensub("}.*","","g",tmp)
}
getline
while ( $0 !~ /\\sectionmark/ ) {
getline
}
printf("\\section[%s]{%s%s}\n",lt,lt,$0)
getline
}
! /\\section{/ { print }' INPUT_FILE
注意:如果在long text}
和\sectionmark
之间出现任何问题,它就无法处理,例如:
\section{long text}**THIS TEXT WILL BE SKIPPED!!**
\sectionmark{short text}
您可以在ACTION HERE中看到它!
如果你想摆脱long text
中的新行,只需用脚本中的"\n"
替换每个" "
。
答案 1 :(得分:1)
这可能对您有用:
echo -e "\section{long text\nwith\nsome\nlinefeeds}\n\sectionmark{short text\nwith\nsome\nlinefeeds}" |
sed ':a;$!{N;ba};s/\(\\section{[^}]*}\)[\s\n]*\\sectionmark{\([^}]*\)}/\1[\2]/g'
\section{long text
with
some
linefeeds}[short text
with
some
linefeeds]