我想拆分\mkcomprange
使用的输出\StrBefore
(或反之亦然,或其他等效方法),但两种排序似乎都不起作用。
期望输出:
23-24;34-35
变为 23–24。的输出
\mkcomprange{\StrBefore{23-24;34-35}{;}}
是23-24。的输出
\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}
因为\expandafter
s 确保在看到它\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}
\StrBefore{\mkcomprange{23-24;34-35}}{,}
不起作用,因为因为\mkcomprange
不可扩展,所以\StrBefore
在 上执行其操作\mkcomprange{23-24;34-35}
,其中没有逗号可找到。
您也可能对。。。有兴趣biblatex \cite 中另一个可选参数内的可选参数其中,Audrey 展示了一种将后记的论证结构拆分为不同子论证的方法。