如何为章节、定义等创建类似于 \pnfmt、\pno、\ppno、\nopp 的宏?

如何为章节、定义等创建类似于 \pnfmt、\pno、\ppno、\nopp 的宏?

我想创建类似于比布拉特克斯\pnfmt, \pno, \ppno,\nopp用于处理引文中的页码,但其他引用模式除外,例如章节、定义、定理等。因此,我希望能够以类似的方式使用,例如, \secfmt, \secno, \secnos,作为章节标签。然而,在这种情况下,和类似可能没有意义,因为默认情况下将数字识别为页码。\nosec\nosec

我该怎么做?当然,代码示例会很棒,但即使是一般性建议也会受到欢迎。

注意:我还希望有相当于\ppspace部分等的命令。

答案1

和朋友的定义\pno可以在biblatex.styll. 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”,那么定义就很简单了paginationbookpagination\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}

Lorem (Sigfridsson and Ryde 1998,另见第 380 页) ipsum (Nussbaum 1978,然后参见 §3) dolor (Elk 1972,参见第 13 段)

\ppspace仅由自动格式指令使用,因此我认为在/和/\ssecspace的上下文中没有必要使用。\pno\secno\ppno\ssecno

答案2

如果有人好奇,这是我的解决方案,很大程度上基于@moewe 的回答。

我最终加入了 的类似物以\ppspace保持一致性。用这种方式控制间距很不错,并且始终忽略 之间的空格(包括不间断空格),例如\secno3中的\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 }

% ----

相关内容