列表分隔符,无逗号,无分号

列表分隔符,无逗号,无分号

我正在再次研究我的 Liederbuch-Package,并且开发了一个元数据系统以在页眉和页脚中使用元数据。

我目前使用它::作为列表分隔符,但我不确定是否没有更好的选择。,并且;是不可能的,因为它们出现在元数据中(即artist = Monty Burns, the evil-doer; Smithers:)。

我目前倾向于使用&|代替::

主要问题是:这个问题是否已在其他地方得到解决?如果是,那么是如何解决的?如果没有,我是否违反了任何样式规则?

IE

\begin{Lied}
[title = Als noch Arkadiens gold'ne Tage ::
lithographer = lilypond ::
artist = Test: Test]
{nt}{5}
\includegraphics[width=\linewidth,page=1]{CVLB5-AlsNochArkadiensGoldeneTage}
\notentext{\nspace*{11}Als \ns noch \ns Ar \ns* ka \ns* \ns di \ns* ens \ns gold \ns* ne \nspace{15}}
\end{Lied}

我可以在页眉或页脚中使用这些值:

\LBHead{\textbf{\print{title}} \\ \print{artist} \hfill \print{lithographer}\par}

答案1

您可以使用 来::作为分隔符expl3,但您需要一些技巧。假设我们在 下ExplSyntaxOn,您可以这样做

\tl_const:Nx \c_maestroglanz_doublecolon_tl { \tl_to_str:n {::} }

当你需要在双冒号处拆分输入时,你可以这样说

\cs_generate_variant:Nn \seq_set_split:Nnn { NV } % needed just once

\seq_set_split:NVn \l_maestroglanz_whatever_seq \c_maestroglanz_doublecolon_tl { #1 }

其中#1代表要分裂的参数。

这是因为\ExplSyntaxOn冒号下是一个字母,但用它保存后\tl_to_str:n我们会将其变回文档中的“其他字符”。

但是,如果您需要将输入传递给,则这将不起作用\keys_set:nn,因为这需要逗号作为分隔符。

在这种情况下,最好用逗号代替逗号,\comma{}并用逗号代替双冒号。

概念证明。

\keys_define:nn { maestroglanz/lied }
 {
  title .tl_set:N = \l_maestroglanz_lied_title_tl,
  lithographer .tl_set:N = \l_maestroglanz_lied_lithographer_tl,
  artist .tl_set:N = \l_maestroglanz_lied_artist_tl,
 }

 \NewDocumentEnvironment{Lied}{O{}mm}
  {
   \tl_set:Nn \l_maestroglanz_lied_options_tl
   \tl_replace_all:Nnn \l_maestroglanz_lied_options_tl { , } { \comma{} }
   \tl_replace_all:NVn \l_maestroglanz_lied_options_tl \c_maestroglanz_doublecolon_tl { , }
   \keys_set:nV { maestroglanz/lied } \l_maestroglanz_lied_options_tl
  % other commands for the begin part
 }
 {
  % commands for the end part
 }

% the needed variants
\cs_generate_variant:Nn \tl_replace_all:Nnn { NV }
\cs_generate_variant:Nn \keys_set:nn { nV }

相关内容