我想创建类似于比布拉特克斯宏\pnfmt
, \pno
, \ppno
,\nopp
用于处理引文中的页码,但其他引用模式除外,例如章节、定义、定理等。因此,我希望能够以类似的方式使用,例如, \secfmt
, \secno
, \secnos
,作为章节标签。然而,在这种情况下,和类似可能没有意义,因为默认情况下将数字识别为页码。\nosec
\nosec
我该怎么做?当然,代码示例会很棒,但即使是一般性建议也会受到欢迎。
注意:我还希望有相当于\ppspace
部分等的命令。
答案1
和朋友的定义\pno
可以在biblatex.sty
(ll. v3.16 中的 4151-4156)。
\pnfmt
不一定与page
/相关pages
,它被定义为使用postnote
格式。因此,将其复制到其他分页类型是没有意义的(类比除外)。同样,\nopp
指示biblatex
不要将后面的内容视为页面或任何其他分段类型(使用页面基础结构实现),因此同样不需要将其复制到其他分段类型(除非您想要一致性)。
需要注意的是,定义
\protected\def\pno{\bibstring{page}}%
\protected\def\ppno{\bibstring{pages}}%
for\pno
和可以被/值\ppno
覆盖,因此也可能产生“section”。如果我们不需要 for和 朋友,因为它们总是会产生“section”,那么定义就很简单了pagination
bookpagination
\pno
\secno
\documentclass[british]{article}
\usepackage[T1]{fontenc}
\usepackage{babel}
\usepackage{csquotes}
\usepackage[backend=biber, style=authoryear]{biblatex}
\newrobustcmd*{\secno}{\ERROR}
\newrobustcmd*{\ssecno}{\ERROR}
\makeatletter
\appto\blx@blxinit{%
\protected\def\secno{\bibstring{section}}%
\protected\def\ssecno{\bibstring{sections}}%
}
\makeatother
\begin{filecontents}{\jobname.bib}
@book{elk,
author = {Anne Elk},
title = {A Theory on Brontosauruses},
year = {1972},
publisher = {Monthy \& Co.},
location = {London},
pagination = {paragraph},
}
\end{filecontents}
\addbibresource{\jobname.bib}
\addbibresource{biblatex-examples.bib}
\begin{document}
Lorem \autocite[see also \pno~380]{sigfridsson}
ipsum \autocite[then see \secno 3]{nussbaum}
dolor \autocite[see \pno~13]{elk} % produces "par" even though we used \pno
\printbibliography
\end{document}
\ppspace
仅由自动格式指令使用,因此我认为在/和/\ssecspace
的上下文中没有必要使用。\pno
\secno
\ppno
\ssecno
答案2
如果有人好奇,这是我的解决方案,很大程度上基于@moewe 的回答。
我最终加入了 的类似物以\ppspace
保持一致性。用这种方式控制间距很不错,并且始终忽略 之间的空格(包括不间断空格),例如\secno
和3
中的\secno~3
或\secno 3
。
更新:根据@moewe 的评论,我可能会删除类似的内容\ppspace
。
% Define command for gobbling whitespace chars (including final non-breaking space).
\NewDocumentCommand \gobblespaces {} {
\exp_last_unbraced:NV \peek_charcode_remove_ignore_spaces:NT \c_tilde_str {}
}
% ---- Define various bibliographic strings.
\NewBibliographyString{section}
\NewBibliographyString{sections}
\NewBibliographyString{chapter}
\NewBibliographyString{chapters}
\NewBibliographyString{figure}
\NewBibliographyString{figures}
\NewBibliographyString{footnote}
\NewBibliographyString{footnotes}
\NewBibliographyString{definition}
\NewBibliographyString{definitions}
\NewBibliographyString{proposition}
\NewBibliographyString{propositions}
\NewBibliographyString{lemma}
\NewBibliographyString{lemmas}
\NewBibliographyString{theorem}
\NewBibliographyString{theorems}
\DefineBibliographyStrings{english}{
section = {\S},
sections = {\S\S},
chapter = {ch.},
chapters = {chs.},
figure = {fig.},
figures = {figs.},
footnote = {fn.},
footnotes = {fns.},
definition = {dfn.},
definitions = {dfns.},
proposition = {prop.},
propositions = {props.},
lemma = {lem.},
lemmas = {lems.},
theorem = {thm.},
theorems = {thms.},
}
% ----
% ---- Define commands for citing various textual elements.
\NewDocumentCommand \gen_ref_cmds { m } {
\tl_map_inline:nn { #1 } {
\seq_set_split:Nnn \item_seq { } { ##1 }
\seq_pop:NN \item_seq \x
\seq_pop:NN \item_seq \bibstring_singular_key
\seq_pop:NN \item_seq \bibstring_plural_key
\StrLeft{\x}{1}[\x_first_char]
\exp_args:NNc \tl_set:Nn \xxspace { \x_first_char \x space }
\exp_args:NNc \tl_set:Nn \xno { \x no }
\exp_args:NNc \tl_set:Nn \xxno { \x_first_char \x no }
\exp_args:NV \NewDocumentCommand \xxspace {} {
\addnbspace
}
\exp_args:NV \NewDocumentCommand \xno {} { \ERROR }
\exp_args:NV \NewDocumentCommand \xxno {} { \ERROR }
\exp_args:NNe \appto \blx@blxinit {
\RenewDocumentCommand \xno {} {
\exp_not:N \bibstring {\bibstring_singular_key}
\xxspace
\exp_not:N \gobblespaces
}
\RenewDocumentCommand \xxno {} {
\exp_not:N \bibstring {\bibstring_plural_key}
\xxspace
\exp_not:N \gobblespaces
}
}
}
}
\gen_ref_cmds {
{ {sec} {section} {sections} }
{ {ch} {chapter} {chapters} }
{ {fig} {figure} {figures} }
{ {fn} {footnote} {footnotes} }
% { {eq} {equation} {equations} }
{ {dfn} {definition} {definitions} }
{ {prop} {proposition} {propositions} }
{ {lem} {lemma} {lemmas} }
{ {thm} {theorem} {theorems} }
}
% ----
% ---- Configure spaces within citations.
\RenewDocumentCommand \ssecspace {} {}
\RenewDocumentCommand \ppspace {} { \addnbspace }
% ----