我很困惑为什么我不能扩展\rightmark
并传递给另一个宏。考虑以下 mwe
\documentclass[12pt, twoside, letterpaper]{scrartcl}
\usepackage{scrlayer-scrpage}
\renewcommand*{\sectionmark}[1]{\markright{item1,item2}}
\ExplSyntaxOn
\lohead{%
{%
\exp_args:NNV \seq_set_from_clist:Nn \l_seq_sec_parts \rightmark%
\seq_item:Nn \l_seq_sec_parts {1}%
}}
\rohead{}
\ExplSyntaxOff
\begin{document}
\section{Some section}
\end{document}
此代码\rightmark
使用 设置为逗号分隔的列表\sectionmark
。然后,在设置左奇数页标题时,代码尝试检索列表的第一项。首先,它调用\seq_set_from_clist:Nn
将列表转换为序列,然后\seq_item:Nn
返回序列的第一项。
\exp_args:NNV
应该完全扩展\rightmark
并将扩展作为参数传递给\seq_set_from_clist:Nn
。
item1
我希望在标题中看到。但是,它没有发生。item1,item2
而是打印了,这意味着\rightmark
没有展开。如何修复它?
答案1
如果我添加\cs_show:N \rightmark
到你的\lohead
代码中,我得到
> \rightmark=macro:->\expandafter \@rightmark \firstmark \@empty \@empty .
您\exp_args:NNV
不需要完全扩展第三个参数,而只需使用一对括号来获得其第一级扩展。
您需要扩展\rightmark
以到达逗号分隔的列表,但不要扩展“太多”,因为脆弱的命令可能会破坏构造。
\documentclass[12pt, twoside, letterpaper]{scrartcl}
\usepackage{scrlayer-scrpage}
\renewcommand*{\sectionmark}[1]{\markright{item1,item2}}
\ExplSyntaxOn
\cs_generate_variant:Nn \clist_item:nn { e }
\lohead
{
\clist_item:en { \text_expand:n { \rightmark } } { 1 }
}
\rohead{}
\ExplSyntaxOff
\begin{document}
\section{Some section}
\end{document}
但是,如果标记中使用了脆弱的命令,这可能会中断。为此,您可以使用