使用 l3keys 中的现有值

使用 l3keys 中的现有值

以下如何打印

Heime Borgia
405 Hilgard Ave
Los Angeles
California
90095
United States

Likku Cirillu
409 Hilgard Ave

而不是

Heime Borgia
405 Hilgard Ave
Los Angeles
California
90095
United States

Likku Cirillu
409 Hilgard Ave
Los Angeles
California
90095
United States

我希望第二次调用使用第一次调用中未设置的变量的现有值。

实施是

\documentclass[a4paper,12pt]{article}

\ExplSyntaxOn

\keys_define:nn { adr_keys }
  {
    name .tl_set:N = \l_adr_name_tl,
    role .tl_set:N = \l_adr_role_tl,
    kmpn .tl_set:N = \l_adr_kmpn_tl,
    dwlg .tl_set:N = \l_adr_dwlg_tl,
    hmlt .tl_set:N = \l_adr_hmlt_tl,
    vltw .tl_set:N = \l_adr_vltw_tl,
    cbrg .tl_set:N = \l_adr_cbrg_tl,
    knty .tl_set:N = \l_adr_knty_tl,
    pstc .tl_set:N = \l_adr_pstc_tl,
    ktry .tl_set:N = \l_adr_ktry_tl,
  }

\cs_new_protected:Nn \adr_print:n
  {
    \keys_set:nn { adr_keys } { #1 }

    \begin {tabular} { @{} l@{} }

      \tl_use:N \l_adr_name_tl \\

      \tl_if_blank:VF \l_adr_role_tl
        { \tl_use:N \l_adr_role_tl \\ }

      \tl_if_blank:VF \l_adr_kmpn_tl
        { \tl_use:N \l_adr_kmpn_tl \\ }

      \tl_if_blank:VF \l_adr_dwlg_tl
        { \tl_use:N \l_adr_dwlg_tl \\ }

      \tl_if_blank:VF \l_adr_hmlt_tl
        { \tl_use:N \l_adr_hmlt_tl \\ }

      \tl_if_blank:VF \l_adr_vltw_tl
        { \tl_use:N \l_adr_vltw_tl \\ }

      \tl_if_blank:VF \l_adr_cbrg_tl
        { \tl_use:N \l_adr_cbrg_tl \\ }

      \tl_if_blank:VF \l_adr_knty_tl
        { \tl_use:N \l_adr_knty_tl \\ }

      \tl_if_blank:VF \l_adr_pstc_tl
        { \tl_use:N \l_adr_pstc_tl \\ }

      \tl_if_blank:VF \l_adr_ktry_tl
        { \tl_use:N \l_adr_ktry_tl \\ }

    \end {tabular}
  }

\NewDocumentCommand {\adrLflush} { m }
  {
    \begin {flushleft}
      \adr_print:n { #1 }
    \end {flushleft}
  }

\ExplSyntaxOff

\begin{document}

\adrLflush
  {
    name={Heime Borgia},
    dwlg={405 Hilgard Ave},
    cbrg={Los Angeles},
    knty={California},
    pstc={90095},
    ktry={United States},
  }

\adrLflush
  {
    name={Likku Cirillu},
    dwlg={409 Hilgard Ave},
  }

\end{document}

答案1

您正在进行本地分配,因此当\end{flushleft}您似乎想要全局分配时,它们会被恢复。

在此处输入图片描述

\documentclass[a4paper,12pt]{article}

\ExplSyntaxOn

\keys_define:nn { adr_keys }
  {
    name .tl_gset:N = \g_adr_name_tl,
    role .tl_gset:N = \g_adr_role_tl,
    kmpn .tl_gset:N = \g_adr_kmpn_tl,
    dwlg .tl_gset:N = \g_adr_dwlg_tl,
    hmlt .tl_gset:N = \g_adr_hmlt_tl,
    vltw .tl_gset:N = \g_adr_vltw_tl,
    cbrg .tl_gset:N = \g_adr_cbrg_tl,
    knty .tl_gset:N = \g_adr_knty_tl,
    pstc .tl_gset:N = \g_adr_pstc_tl,
    ktry .tl_gset:N = \g_adr_ktry_tl,
  }

\cs_new_protected:Nn \adr_print:n
  {
    \keys_set:nn { adr_keys } { #1 }

    \begin {tabular} { @{} l@{} }

      \tl_use:N \g_adr_name_tl \\

      \tl_if_blank:VF \g_adr_role_tl
        { \tl_use:N \g_adr_role_tl \\ }

      \tl_if_blank:VF \g_adr_kmpn_tl
        { \tl_use:N \g_adr_kmpn_tl \\ }

      \tl_if_blank:VF \g_adr_dwlg_tl
        { \tl_use:N \g_adr_dwlg_tl \\ }

      \tl_if_blank:VF \g_adr_hmlt_tl
        { \tl_use:N \g_adr_hmlt_tl \\ }

      \tl_if_blank:VF \g_adr_vltw_tl
        { \tl_use:N \g_adr_vltw_tl \\ }

      \tl_if_blank:VF \g_adr_cbrg_tl
        { \tl_use:N \g_adr_cbrg_tl \\ }

      \tl_if_blank:VF \g_adr_knty_tl
        { \tl_use:N \g_adr_knty_tl \\ }

      \tl_if_blank:VF \g_adr_pstc_tl
        { \tl_use:N \g_adr_pstc_tl \\ }

      \tl_if_blank:VF \g_adr_ktry_tl
        { \tl_use:N \g_adr_ktry_tl \\ }

    \end {tabular}
  }

\NewDocumentCommand {\adrLflush} { m }
  {
    \begin {flushleft}
      \adr_print:n { #1 }
    \end {flushleft}
  }

\ExplSyntaxOff

\begin{document}

\adrLflush
  {
    name={Heime Borgia},
    dwlg={405 Hilgard Ave},
    cbrg={Los Angeles},
    knty={California},
    pstc={90095},
    ktry={United States},
  }

\adrLflush
  {
    name={Likku Cirillu},
    dwlg={409 Hilgard Ave},
  }

\end{document}

相关内容