ruby - 如何仅在某些 LaTeX 命令参数的范围内进行替换?

标签 ruby regex perl latex

下面的 Latex 写在一行中,但也可能超过几行。

问题是标题命令中的 # 必须转义,所以问题是如何仅在标题中执行此操作?

或者是否存在一个 Perl/Ruby 模块可以在如此复杂的情况下找到结束

\caption{\small{Et elliptisk område i planen er afgrænset af en ellipse som er niveaukurven $\mathcal{K }_{0}(f)$ for andengradspolynomiet $f(x,y) = 2\cdot x^{2} + 2\cdot y^{2} + 2\cdot x\cdot y -8\cdot x -10 \cdot y + 13$. Se opgave \ref{exercEllipseLevel} og eksempel \href{./20-Keglesnit.pdf#evncount.20.1}{ 20.1} i eNote \ref{tn20}.}} \label{figEllipseLevel}

最佳答案

现在您已经添加了 Ruby 标记,这是一个 Ruby 中的强力解决方案。它效率不高,但安全且简单。

x.split('\caption').each_with_index.map { |str, i|
  next str if i == 0
  indent = 0
  end_caption = str.length
  str.split('').each_with_index do |c, ci|
    if c == '{'
      indent = indent + 1
    elsif c == '}'
      indent = indent - 1
      if (indent == 0)
        end_caption = ci
        break
      end
    end
  end
  str[0..(end_caption)].gsub(/([^\\])#/,'\1\\#')+ str[(end_caption+1)..-1]
}.join(‘\caption')

或者如果您正在寻找单线,那么

x.gsub(/\\caption\{((?:[^{}]+|\{\g<1>\})+)\}/m)  { |xx| Regexp.last_match[0].gsub(/([^\\])#/,’\1\\#’) }

所有这些当然都需要您的 Latex 文件可以编译。

对于 Perl,您可以考虑 Text::Balanced

关于ruby - 如何仅在某些 LaTeX 命令参数的范围内进行替换?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/44926686/

相关文章:

perl - 如何用哈希切片做 `defined`

ruby - 发布确认 - MQTT

ruby - 使用 rvm 在没有 pthread 的情况下安装 ruby

ruby - Sinatra 在 ctrl-c 后重启 Webrick 服务器

javascript - 使用 JavaScript 获取字符串上 '[ ]' 之间的所有值

multithreading - 如何在Perl中处理客户端服务器通信?

ruby-on-rails - 使用正则表达式从字符串中提取电话号码?

正则表达式 - 如何编写正则表达式以仅捕获数字或字母数字,而不仅仅是字母

asp.net-mvc - 正则表达式匹配数值范围

perl - 如何更改perl的位置?