如何教 ConTeXt 识别和格式化自定义语法?

如何教 ConTeXt 识别和格式化自定义语法?

我有一份充满编辑评论的文档,如下所示:

\starttext

    This [is ]some text with
    comment[s] added to show
    corrections to erro[r]s.

\stoptext

我需要将注释加粗,以便更显眼。结果将与此相同:

\starttext

    This {\bf [is ]}some text with
    comment{\bf [s]} added to show
    corrections to erro{\bf [r]}s.

\stoptext

有没有什么方法可以教会 ConTeXt 以这种格式和方括号格式化方括号中出现的所有文本,而无需手动{\bf *}向文本添加语法?

答案1

如果注释太短,无法跨越多行,则可以使用输入处理程序

\startluacode
  local lpeg         = require "lpeg"
  local lpegmatch    = lpeg.match
  local Cs, P, V     = lpeg.Cs, lpeg.P, lpeg.V
  local lbrak        = P "["
  local rbrak        = P "]"
  local inner        = P { lbrak * (V (1) + (1 - rbrak))^1 * rbrak }
  local outer        = (lbrak / [[{\bf[]])
                     * (inner + (1 - rbrak))^1
                     * (rbrak / "]}")
  local p_rewrite    = Cs ((outer + 1)^0)

  resolvers.installinputlinehandler (function (line)
    return lpegmatch (p_rewrite, line)
  end)
\stopluacode

\starttext

    This [is ]some [[text] with]
    comment[s] added to show
    corrections to erro[r]s.

    \blank [3*line] %% <= fail

    Unmatching [[[brackets are
    unaffected]. [Nesting [is]]
    fine, though.

\stoptext

示例代码通过 LPEG 替换模式重写输入行。允许在突出显示区域嵌套内嵌套匹配的括号对,不匹配的左括号将被忽略。

不过,有一个问题:在 TeX 有机会处理宏之前,替换就已应用。由于在 Context 中方括号通常用于界定宏参数,因此如果文件包含其他标记,则可能会产生很多干扰。如果是这种情况,您可能需要切换到不同的分隔符对,例如“<”、“>”。

相关内容