链接 \StrBefore 和 \mkcomprange

链接 \StrBefore 和 \mkcomprange

我想拆分\mkcomprange使用的输出\StrBefore(或反之亦然,或其他等效方法),但两种排序似乎都不起作用。

  1. 期望输出:23-24;34-35变为 23–24。

  2. 的输出\mkcomprange{\StrBefore{23-24;34-35}{;}}是23-24。

  3. 的输出\StrBefore{\mkcomprange{23-24;34-35}{,}}为空白。

我猜 #3 的输出是因为\mkcomprange没有输出文字逗号,但我不明白为什么 #2 不起作用,而\mkcomprange{23-24}输出 23–24 则符合预期。我应该注意,这一切都是在 的上下文中biblatex-chicago


更广泛的背景:我正在研究一种自定义 biblatex 条目类型,它要求我从 postnote 中解析出两组不同的页码,并将它们打印在引文中的两个不同位置。第一组是引用文档自己的内部段落编号,而第二组是正在使用的特定印刷版的页面。例如,我想\autocite[23-24;34-35]{doc}输出“作者,文档标题 23–24:书名(地点:出版商,2020)34–35”。我已经准备好所有其他部分,但我还没能弄清楚如何让两种不同的编号方案发挥作用。

我当前的设置大致如下:

\DeclareFieldFormat{postnote:first}{%
    \mkcomprange{\StrBefore{#1}{;}}%
}
\DeclareFieldFormat{postnote:second}{...}
\printfield[postnote:first]{postnote}
\printfield[postnote:second]{postnote}

答案1

这是一个可扩展性问题,而且 TeX 中的字符串操作很困难。

本质上,只有当参数是文字字符串时, 才会像宣传的那样工作biblatex。如果参数太复杂, 无法正确解析,则不会执行任何操作。甚至\mkcomprange{<text>}<text>\mkcomprange\mkcomprange

\newcommand\foo{23-24;34-35}
\mkcomprange{\foo}

正如人们希望的那样工作,因为\foo它不是一个字符串(它是一个扩展为字符串的宏)。

\mkcomprange{\StrBefore{23-24;34-35}{;}}

\mkcomprange什么都不做,因为它的参数太复杂了,只能\StrBefore做它的事情,留给我们

23-24

而不是想要的

23\bibrangedash 4

回到\foo上面的例子,下面的方法有效

\newcommand\foo{23-24;34-35}
\expandafter\mkcomprange\expandafter{\foo}

因为\expandafters 确保在看到它\foo之前先展开\mkcomprange,所以它\mkcomprange不是用参数调用的\foo(这没有做正确的事情,参见上文)而是用23-24;34-35(这有效)。

沿着这个思路进一步思考,人们可以尝试

\expandafter\mkcomprange\expandafter{\StrBefore{23-24;34-35}{;}}

不幸的是,该命令失败了,并显示各种错误消息。这里的问题是该命令\StrBefore不可扩展,这意味着它不能使用类似\expandafter(或在\edef上下文中)的命令来直接显示字符串。

的开发人员xstring实现了一个解决方法:您可以将\StrBefore其输出写入宏并使用它。因此以下方法再次有效

\StrBefore{23-24;34-35}{;}[\AVBtemp]
\expandafter\mkcomprange\expandafter{\AVBtemp}

对于您的简单要求,您根本不需要xtstring。您可以自己构建一些可以拆分帖子的东西;

\documentclass[british]{article}
\usepackage[T1]{fontenc}
\usepackage[utf8]{inputenc}
\usepackage{babel}
\usepackage{csquotes}

\usepackage[style=authoryear, backend=biber]{biblatex}

\addbibresource{biblatex-examples.bib}

\makeatletter
\newcommand*{\AVBpostnotesplitcompOne}[1]{\AVBpostnotesplitcompOne@i #1;\relax}
\def\AVBpostnotesplitcompOne@i#1;#2\relax{%
 \ifblank{#2}
   {\mkcomprange{#1}}
   {\AVBpostnotesplitcompOne@ii #1;#2\relax}}
\def\AVBpostnotesplitcompOne@ii#1;#2;\relax{\mkcomprange{#1}}

\newcommand*{\AVBpostnotesplitcompTwo}[1]{\AVBpostnotesplitcompTwo@i #1;\relax}
\def\AVBpostnotesplitcompTwo@i#1;#2\relax{%
 \ifblank{#2}
   {}
   {\AVBpostnotesplitcompTwo@ii #1;#2\relax}}
\def\AVBpostnotesplitcompTwo@ii#1;#2;\relax{\mkcomprange{#2}}
\makeatother


\begin{document}
\AVBpostnotesplitcompOne{Hallo}|\AVBpostnotesplitcompTwo{Hallo}

\AVBpostnotesplitcompOne{23-24;35-36}|\AVBpostnotesplitcompTwo{23-24;35-36}

\AVBpostnotesplitcompOne{23-24;}|\AVBpostnotesplitcompTwo{23-24;}

\AVBpostnotesplitcompOne{;35-36}|\AVBpostnotesplitcompTwo{;35-36}

\AVBpostnotesplitcompOne{23-24;35-36;46-45}|\AVBpostnotesplitcompTwo{23-24;35-36;46-45}

\cite{sigfridsson}
\printbibliography
\end{document}

你好|//23–4|35–6//23–4|//|35–6//23–4|35–6, 46–5


\StrBefore{\mkcomprange{23-24;34-35}}{,}

不起作用,因为因为\mkcomprange不可扩展,所以\StrBefore在 上执行其操作\mkcomprange{23-24;34-35},其中没有逗号可找到。


您也可能对。。。有兴趣biblatex \cite 中另一个可选参数内的可选参数其中,Audrey 展示了一种将后记的论证结构拆分为不同子论证的方法。

相关内容