属性列表与 \cs_set 误用...但与 \NewDocumentCommand 一起使用没有问题?

属性列表与 \cs_set 误用...但与 \NewDocumentCommand 一起使用没有问题?

在努力expl3更好地理解的过程中,我发现了一个property list was misused我不理解的错误。

代码概念:

创建一个宏 ( \MarkAndSave),它将\S向文本添加一个可视标记 ( 此处),可能用于表示某种注释或待办事项。此外,将此标记保存到属性列表中,以便最后我们拥有任何给定页面的标记列表。

问题:

坦白说,这是一个已经解决的问题:如果我用 定义宏\NewDocumentCommand,就不会出现任何错误……

\NewDocumentCommand {\MarkAndSave} {} {...}

但我想我会使用expl3语法来定义宏:

\cs_set:Npn \MarkAndSave {...}

在这种情况下,我得到了如下各种错误:

! Undefined control sequence.
<argument> \LaTeX3 error: 
                           A property list was misused.
l.35 \subsection{\MarkAndSave In a Subsection}

但错误并不一致:

  • 无错误:\MarkAndSave仅使用一次(任何地方)
  • 无错误:\MarkAndSave用于章节标题,但未用于段落文本
  • 无错误:\MarkAndSave仅用于段落文本,而不用于标题
  • 错误:\MarkAndSave在段落文本中使用后又在标题中使用

所以,我的问题有两个方面:

  1. 什么原因导致错误只在这种特定情况下出现?
  2. 做什么\NewDocumentCommand可以避免这些错误?......或者,我做错了什么expl3

MWE(TeXLive 2021):

\documentclass{article}
\begin{document}

\ExplSyntaxOn
\prop_clear_new:N \g_cslstr_proplist
\cs_generate_variant:Nn \prop_put:Nnn {Nxn}

%% If defined with NewDocCommand, works everywhere
% \NewDocumentCommand {\MarkAndSave} {} {%
%% If defined with cs_set, does not work in some headings
\cs_set:Npn \MarkAndSave {%

    % Output the mark
    \S
    % Register this mark in the list for this page
    \prop_put:Nxn {\g_cslstr_proplist}
        {page\arabic{page}}
        {Marked}
    % Debug output
    \prop_log:N \g_cslstr_proplist
}
\ExplSyntaxOff

\section{\MarkAndSave In a Section}

Play around with the ordering and marked / not marked lines to see errors.

Not a marked paragraph.

\MarkAndSave A marked paragraph.

\section{\MarkAndSave Property List Misused if in heading following a marked paragraph}

Not a marked paragraph.

\subsection{\MarkAndSave In a Subsection}

\end{document}

相关内容