\cs:w 处未封闭组的烦人语法突出显示

\cs:w 处未封闭组的烦人语法突出显示

于是我查看了我的序言,Overleaf 对我大喊大叫,因为我没有在下面附加的代码段后面添加结束括号,这很奇怪,因为该组确实是封闭的。为了确认,我删除了几个命令,直到我意识到问题出现在第 6 行\cs:w

有什么想法吗?

\ExplSyntaxOn
\NewDocumentCommand{\newenvcommand}{ m m } % #1 = env name, #2 = command name
{
    \cs_if_exist:cF { g_envc_#1_list_tl } { \tl_new:c { g_envc_#1_list_tl } }
    \tl_gput_right:cn { g_envc_#1_list_tl } { #2 }
    \exp_after:wN \newcommand \cs:w envc_#1_\cs_to_str:N #2 \cs_end:
}
\NewDocumentCommand{\checkenvcommands}{ }
{
    \cs_if_exist:cT { g_envc_\use:c {@currenvir} _list_tl }
    {
        \tl_map_inline:cn { g_envc_\use:c {@currenvir} _list_tl }
        {
            \cs_set_eq:Nc ##1 { envc_\use:c {@currenvir} _\cs_to_str:N ##1 }
        }
    }
}
\ExplSyntaxOff

答案1

(我是 Overleaf 的支持人员。)

代码方面已在另一个答案。我将重点关注“Overleaf 对你大喊大叫” :-)。

Overleaf 用作chktex编辑器内语法检查器。这对于典型的文档来说效果很好。但是如果你的代码中包含某些 TeX 编程结构,chktex则可能会报告误报,其中有效代码被标记为错误。

您可以使用一些策略来禁用项目中有问题部分的语法检查器:

  1. 您可以在项目设置中完全禁用代码检查(左上角的 Overleaf 菜单)。
  2. %%novalidate您可以通过添加文件的第一行来禁用特定文件的代码检查。
  3. %%begin novalidate您可以通过用和括住要忽略的行来禁用文件部分内容的代码检查%%end novalidate

来源:在 Overleaf 上检查代码

答案2

我不知道 Overleaf 会不会对你大喊大叫。但你肯定可以通过使用更好的代码来避免这种情况:

\ExplSyntaxOn
\NewDocumentCommand{\newenvcommand}{ m m } % #1 = env name, #2 = command name
{
    \tl_if_exist:cF { g_envc_#1_list_tl } { \tl_new:c { g_envc_#1_list_tl } }
    \tl_gput_right:cn { g_envc_#1_list_tl } { #2 }
    \exp_args:Nc \newcommand { w envc_#1_\cs_to_str:N #2 }
}
\NewDocumentCommand{\checkenvcommands}{ }
{
    \tl_if_exist:cT { g_envc_\use:c {@currenvir} _list_tl }
    {
        \tl_map_inline:cn { g_envc_\use:c {@currenvir} _list_tl }
        {
            \cs_set_eq:Nc ##1 { envc_\use:c {@currenvir} _\cs_to_str:N ##1 }
        }
    }
}
\ExplSyntaxOff

使用\exp_args:Nc,TeX 将跳过下一个标记,并从以下括号组中的标记中生成一个控制序列名称,这是更高级别的expl3对应项

\expandafter\newcommand\csname <tokens>\endcsname

在“旧式”编程中。

还要注意,\tl_if_exist:cF而不是\cs_if_exist:cF。您正在检查变量,而不是函数。

相关内容