我是 LaTeX 新手。我遇到了以下问题。
如何删除文本中的 LaTeX 宏但不删除其参数?具体来说,如何替换文本中的宏,例如
\command1{text_inside_the_brackets}
括号内的文字是否相同?(括号内的文字不同)。
手动替换非常耗时,有人知道如何加快速度吗?
答案1
假设您有sed
:
sed 's/\\command1{\([^}\\{]*\)}/\1/g' <filename.tex> > filename-new.tex
需要注意的是,正则表达式并不完全相同,正确的语法取决于您使用的命令。因此,在一个编辑器中正确的语法可能与在另一个编辑器中不同。例如,Kile 使用的语法与 vim 不同。
上述命令将捕获全部的实例,\mycommand1{}
即使它们位于同一行。(这就是g
末尾的 所起的作用。)
就像 Tobi 的代码一样,它将不是替换类似
\mycommand1{here is some text} which I wrote earlier \mycommand2{like this}
和
here is some text} which I wrote earlier \mycommand2{like this
而是
here is some text which I wrote earlier \mycommand2{like this}
这可能就是你想要的。但是,它会捕获类似
\mycommand1{here-is-some-hyphenated-text}
但它仍会忽略嵌套命令,如\mycommand1{\mycommand2{hi}}
。[^}\\{]
告诉它忽略包含{
或\
介于和之间的链{
,}
但允许单个范围内的任何其他内容{...}
。
检查结果是否符合您的预期非常重要。因此,输出将发送到文件的新副本,而不是覆盖原始文件。这样,如果结果不符合您的预期,您可以轻松恢复。
答案2
我猜你想更改代码而不是生成的 PDF。使用正则表达式,你可以进行高级搜索和替换。表达式
\\[A-z]*\{([A-z0-9 ]*)\}
结合更换
\1
将取代全部文本中的宏
Text \macro{Text 1} \command{Text 2} Text
到
Text Text 1 Text 2 Text
只要参数出现在一行中并且仅包含字母、数字和空格即可。如果您只想替换某个宏,请更改\\[A-z]*
为\\macroname
。
仔细查看搜索词
\\ backslash
[A-z]* only letters, * = of any number
\{ opening brace
( begin a group
[A-z0-9 ]* letters, numbers and spaces
) end group
\} closing brace
可以通过\<n>
替换文本来访问一个组。
有些编辑器提供了删除单个命令的快捷键,但没有提供其参数。例如,在 Mac 上的 TeXstudio 中,快捷键是alt+ 。Del