如何删除文本中的乳胶宏但不删除其参数

如何删除文本中的乳胶宏但不删除其参数

我是 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

相关内容