在努力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
在段落文本中使用后又在标题中使用
所以,我的问题有两个方面:
- 什么原因导致错误只在这种特定情况下出现?
- 做什么
\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}