如何扩展 \rightmark?

如何扩展 \rightmark?

我很困惑为什么我不能扩展\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}

但是,如果标记中使用了脆弱的命令,这可能会中断。为此,您可以使用

相关内容