组内加星号的选项和设置

组内加星号的选项和设置

我想修改以下个人交叉引用宏(最初的想法来自于这个问题:使用 zlabel 的宏 supra/infra)。

% !TEX encoding = UTF-8 Unicode
% !TEX program = lualatex

\documentclass{article}
\usepackage{polyglossia}
  \setmainlanguage{italian}
\usepackage{zref-vario}
\usepackage{varioref}
\usepackage{lipsum}
\usepackage{hyperref}

\newcounter{labelcount}
\AddToHook{cmd/zlabel/before}{\stepcounter{labelcount}}

\makeatletter
\ExplSyntaxOn

\zref@newprop{labelcount}{\arabic{labelcount}}
\zref@addprop{main}{labelcount}

\cs_new:Npn \suprainfra_text:n #1
  {
    \int_compare:nNnF { \clist_count:n {#1} } > { 1 }
      {
        \int_compare:nNnTF
          { \arabic{labelcount} }
            <
          { \zref@extractdefault {#1} {labelcount} {0} }
          { infra }
          { supra }
      }
  }

\cs_new_protected:Npn \tl_zcref_ref:n #1 { \zcref{#1} }
\cs_new_protected:Npn \tl_zcref_page:n #1 { \zvpageref{#1} }
\keys_define:nn {option}
  {
    type .choice: ,
    type / ref .code:n = \tl_set:Nn \l__option_type_tl {\tl_zcref_ref:n} ,
    type / page .code:n = \tl_set:Nn \l__option_type_tl {\tl_zcref_page:n} ,
    type .initial:n = page ,
    ref .meta:n     = { type = ref } ,
    ref .value_forbidden:n = true ,
  }

\bool_new:N \l__option_parent_bool
\keys_define:nn {option}
  {
    parent .bool_set:N = \l__option_parent_bool ,
    parent .initial:n = true ,
    noparent .meta:n    = { parent = false } ,
    noparent .value_forbidden:n = true ,
  }

\cs_new_protected:Npn \ts_suprainfra_text_type_noparent:nn #1#2
  { \emph { \suprainfra_text:n {#2} }, ~ \l__option_type_tl {#2} }

\cs_new_protected:Npn \ts_suprainfra_text_type_parent:nn #1#2
  { ( \ts_suprainfra_text_type_noparent:nn {#1}{#2} ) }

\cs_new_protected:Npn \ts_suprainfra:nn #1#2
  {
    \group_begin:
      \keys_set:nn {option} {#1}
      \bool_if:NTF \l__option_parent_bool
        { \ts_suprainfra_text_type_parent:nn {#1}{#2} }
        { \ts_suprainfra_text_type_noparent:nn {#1}{#2} }
    \group_end:
  }
  
\NewDocumentCommand {\supinf} {O{} m}
  { \ts_suprainfra:nn {#1} {#2} }

\ExplSyntaxOff
\makeatother

\begin{document}
\section{First Section}\zlabel{sec1}
\lipsum[1][1-4]

\section{Second Section}
\verb|\supinf[type=ref]{sec1}|\quad \supinf[type=ref]{sec1}
\par\medskip
\verb|\supinf[type=page]{sec1}|\quad \supinf[type=page]{sec1}
\par\medskip
\verb|\supinf{sec3}|\quad \supinf{sec3}
\par\medskip
\verb|\supinf[ref]{sec3}|\quad \supinf[ref]{sec3}
\par\medskip
\verb|\supinf[noparent]{sec3}|\quad \supinf[noparent]{sec3}
\par\medskip
\verb|\supinf[noparent,ref]{sec3}|\quad \supinf[noparent,ref]{sec3}

\section{Third Section}\zlabel{sec3}
\lipsum[2][1-4]
\end{document}

在此处输入图片描述 该宏\supinf采用两个可选参数:type=ref|pageparent=true|false

type参数调用\zcref函数(按zref-clever包)和\zvpageref函数(按zref-vario包)。

现在我想实现两件我无法独立完成的事情:

  1. 一个\supinf*(带星号的)版本,取决于\zcref*\zvpageref*
  2. 修改一些关于意大利语本地化的默认条款(这些变化仅适用于个人宏),如下所示:
    • zref-clever意大利语术语:
      • 类型 = 章节
        • 名称-sg|名称-pl =帽。
      • 类型 = 部分
        • 名称-sg|名称-pl =§
      • 类型 = 页面
        • 名称-sg|名称-pl =
      • 类型 = 脚注|尾注|注释
        • 名称-sg|名称-pl =n.
    • zref-vario意大利语表达:
      • reftextfaceafter = {\zvhyperlink{p. a fianco}}
      • reftextfacebefore = {\zvhyperlink{p.未婚夫
      • reftextafter = {\zvhyperlink{p. successiva}}
      • reftextbefore = {\zvhyperlink{p. successiva}}
      • reftextcurrent = {\zvhyperlink{p. corrente}}
      • reftextfaraway = {\zcpageref{#1}}
      • reftextpagerange = {\zcpageref[范围]{#1,#2}}
      • reftextlabelrange = {\zcref[范围]{#1,#2}}

最后,我完全清楚我的代码不遵守 expl3 约定,但我无法做得更好:-) 如果有人能给我建议,我将不胜感激。

答案1

正如评论中提到的,我认为另一个答案的基础更好,即尝试使用命令的几个变体来控制自定义,而不是将它们作为选项。因为,在那里,您可以完全访问选项\zcref,因为您将它们传递给包装的调用。在这里,您必须混合它们,如果不破解包的内部结构,您就无法做到这一点。或者,失去将选项传递给的能力\zcref

关于仅针对此命令应用的参考自定义,您无法“针对意大利语”执行此操作。在和中zref-cleverzref-vario语言设置都被视为全局设置,因此\zcLanguageSetup\zvLanguageSetup仅为前言。对于您可以在命令组中使用本地设置来执行此类操作的,但没有等效的,它已经是和的包装器,因此它zref-clever所能提供的灵活性有一些限制。这里唯一真正的替代方法是声明一种新的“语言”,例如,为和填充它,然后在命令组中设置。您将获得完全的灵活性,但这需要相当多的设置。\zcRefTypeSetupzref-variovariorefzref-cleverzref-cleversupinf-italianzref-cleverzref-vario\zcsetup{lang=supinf-italian}

但你似乎非常想要这个,所以你有一个可能的版本:

% !TEX encoding = UTF-8 Unicode
% !TEX program = lualatex

\documentclass{article}
\usepackage{polyglossia}
  \setmainlanguage{italian}
\usepackage{zref-clever}
\usepackage{zref-vario}
\usepackage{varioref}
\usepackage{lipsum}
\usepackage{hyperref}

\newcounter{labelcount}
\AddToHook{cmd/zlabel/before}{\stepcounter{labelcount}}

\makeatletter
\ExplSyntaxOn

\zref@newprop{labelcount}{\arabic{labelcount}}
\zref@addprop{main}{labelcount}

% From https://tex.stackexchange.com/a/670745/105447
\cs_new:Npn \my_suprainfra_text:n #1
  {
    \int_compare:nNnF { \clist_count:n {#1} } > { 1 }
      {
        \int_compare:nNnTF
          { \arabic{labelcount} }
            <
          { \zref@extractdefault {#1} {labelcount} {0} }
          { \emph{infra},~ }
          { \emph{supra},~ }
      }
  }

\cs_new_protected:Npn \my_supinf:nnn #1#2#3
  {
    \group_begin:
    \my_supinf_setup:
    \keys_set:nn { my/supinf } {#2}
    \bool_if:NT \l__my_supinf_parens_bool { ( }
    \my_suprainfra_text:n {#3}
    \bool_if:nTF {#1}
      {
        \bool_if:NTF \l__my_supinf_vario_page_bool
          { \zvpageref*{#3} }
          { \zcref*{#3} }
      }
      {
        \bool_if:NTF \l__my_supinf_vario_page_bool
          { \zvpageref{#3} }
          { \zcref{#3} }
      }
    \bool_if:NT \l__my_supinf_parens_bool { ) }
    \group_end:
  }

\cs_new_protected:Npn \my_supinf_setup:
  {
    \zcRefTypeSetup{chapter}
      {
        Name-sg=Cap.,
        Name-pl=Cap.,
        name-sg=cap.,
        name-pl=cap.,
      }
    \zcRefTypeSetup{section}
      {
        Name-sg=§,
        Name-pl=§,
        name-sg=§,
        name-pl=§,
      }
    \zcRefTypeSetup{page}
      {
        Name-sg=P.,
        Name-pl=P.,
        name-sg=p.,
        name-pl=p.,
      }
    \zcRefTypeSetup{footnote}
      {
        Name-sg=N.,
        Name-pl=N.,
        name-sg=n.,
        name-pl=n.,
      }
    \zcRefTypeSetup{endnote}
      {
        Name-sg=N.,
        Name-pl=N.,
        name-sg=n.,
        name-pl=n.,
      }
    \zcRefTypeSetup{note}
      {
        Name-sg=N.,
        Name-pl=N.,
        name-sg=n.,
        name-pl=n.,
      }
  }

\bool_new:N \l__my_supinf_parens_bool
\bool_new:N \l__my_supinf_vario_page_bool
\keys_define:nn { my/supinf }
  {
    type .choice: ,
    type / ref .code:n = { \bool_set_false:N \l__my_supinf_vario_page_bool } ,
    type / page .code:n = { \bool_set_true:N \l__my_supinf_vario_page_bool } ,
    type .initial:n = page ,
    ref .meta:n = { type = ref } ,
    ref .value_forbidden:n = true ,
    parens .bool_set:N = \l__my_supinf_parens_bool ,
    parens .initial:n = true ,
    noparens .meta:n    = { parens = false } ,
    noparens .value_forbidden:n = true ,
  }

\NewDocumentCommand{\supinf}{ s O{} m }{
  \my_supinf:nnn {#1} {#2} {#3}
}

\ExplSyntaxOff
\makeatother

\begin{document}
\section{First Section}\zlabel{sec1}
\lipsum[1][1-4]

\section{Second Section}
\verb|\supinf[type=ref]{sec1}|\quad \supinf[type=ref]{sec1}
\par\medskip
\verb|\supinf[type=page]{sec1}|\quad \supinf[type=page]{sec1}
\par\medskip
\verb|\supinf{sec3}|\quad \supinf{sec3}
\par\medskip
\verb|\supinf[ref]{sec3}|\quad \supinf[ref]{sec3}
\par\medskip
\verb|\supinf[noparens]{sec3}|\quad \supinf[noparens]{sec3}
\par\medskip
\verb|\supinf[noparens,ref]{sec3}|\quad \supinf[noparens,ref]{sec3}
\par\medskip
\verb|\supinf*{sec3}|\quad \supinf*{sec3}

\section{Third Section}\zlabel{sec3}
\lipsum[2][1-4]
\end{document}

在此处输入图片描述

相关内容