我想修改以下个人交叉引用宏(最初的想法来自于这个问题:使用 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|page
和parent=true|false
。
type
参数调用\zcref
函数(按zref-clever
包)和\zvpageref
函数(按zref-vario
包)。
现在我想实现两件我无法独立完成的事情:
- 一个
\supinf*
(带星号的)版本,取决于\zcref*
和\zvpageref*
; - 修改一些关于意大利语本地化的默认条款(这些变化仅适用于个人宏),如下所示:
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-clever
,zref-vario
语言设置都被视为全局设置,因此\zcLanguageSetup
和\zvLanguageSetup
仅为前言。对于您可以在命令组中使用本地设置来执行此类操作的,但没有等效的,它已经是和的包装器,因此它zref-clever
所能提供的灵活性有一些限制。这里唯一真正的替代方法是声明一种新的“语言”,例如,为和填充它,然后在命令组中设置。您将获得完全的灵活性,但这需要相当多的设置。\zcRefTypeSetup
zref-vario
varioref
zref-clever
zref-clever
supinf-italian
zref-clever
zref-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}