根据 biblatex 样式定义新命令

根据 biblatex 样式定义新命令

我正在制作一份新文档,但我遇到的问题是,我仍然不知道在提交时需要什么参考书目样式。它可能是温哥华样式或 APA 样式。我之所以使用,biblatex是因为我觉得它最方便使用。但是,如果我使用温哥华样式,我会得到如下引用

据 person1 等人 (1) ...文本...

或者,也许这有点困难

据 person1 等人 ^1 ...文本...

我可以这样做

According to \citeauthor{person1} \cite{person1} ...text...

According to \citeauthor{person1} \supercite{person1} ...text...

biblatex style=apa但如果我使用上面相同的代码进行更改,我会得到

据 person1 等人 (person1 等人 2024)...文本...

这是多余的,并且将是:

根据 person1 等人 (2024)...文本...

我想创建一个命令来检测选项中是否存在style=vancouver或,如果第一个命令为真则执行一个命令,如果第二个命令为真则执行另一个命令style=apabiblatex

我的想法如下

\documentclass{article}
\usepackage[style=vancouver, backend=biber]{biblatex}
\usepackage{etoolbox}
\newif\ifvancouverstyle
\newif\ifapastyle

\ifcsstrequal{blx@bibstyle}{\string vancouver}{
    \vancouverstyletrue
}{
    \vancouverstylefalse
}

\ifcsstrequal{blx@bibstyle}{\string apa}{
    \apastyletrue
}{
    \apastylefalse
}

\newcommand{\detectstyle}{%
    \ifvancouverstyle
        % The action if the style is "vancouver"
        This is the Vancouver style.
    \fi
    \ifapastyle
        % The action if style is "apa"
        This is APA style.
    \fi
}

\begin{document}

\title{Hello}
\author{me}
\maketitle

\detectstyle

\end{document}

目前我还不知道如何配置这个新命令,甚至不知道能否获取它。但是,当我输入时\detectstyle,什么都没有打印出来。

目前缺少参数。如果有人能帮助我,我将不胜感激。

答案1

对于这种特殊用例,您不需要命令来检测引用样式,您只需使用即可\textcite

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

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

\addbibresource{biblatex-examples.bib}

\begin{document}
Then \textcite{sigfridsson} showed

\printbibliography
\end{document}

使用 APA 格式您可以获得

然后 Sigfridsson 和 Ryde (1998) 证明

如果你将其style=apa更改style=vancouver

然后Sigfridsson和Ryde[1]证明


\texcite如果你对输出结果不满意style=vancouver,你必须运行某些代码(例如Biblatex \textcite 使用上标参考编号) 仅当 (cite)style 为 时vancouver,才可以使用\ifdefstring\blx@cbxfile{vancouver}{<true>}{<false>}(within \makeatletter...\makeatother)。

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

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

\makeatletter
\ifdefstring\blx@cbxfile{vancouver}
  {\renewbibmacro*{textcite}{%
     \iffieldequals{namehash}{\cbx@lasthash}
       {\mkbibsuperscript{\supercitedelim}}
       {\cbx@tempa
        \ifnameundef{labelname}
          {\printfield[citetitle]{labeltitle}}
          {\printnames{labelname}}}%
     \ifnumequal{\value{citecount}}{1}
       {}
       {}%
     \mkbibsuperscript{\usebibmacro{cite}}%
     \savefield{namehash}{\cbx@lasthash}%
     \gdef\cbx@tempa{\addspace\multicitedelim}}%

   \DeclareCiteCommand{\textcite}
      {\let\cbx@tempa=\empty
       \undef\cbx@lasthash
       \iffieldundef{prenote}
         {}
         {\BibliographyWarning{Ignoring prenote argument}}%
      \iffieldundef{postnote}
        {}
        {\BibliographyWarning{Ignoring postnote argument}}}
     {\usebibmacro{citeindex}%
      \usebibmacro{textcite}}
     {}
     {}}
  {}
\makeatother

\addbibresource{biblatex-examples.bib}

\begin{document}
Then \textcite{sigfridsson} showed

\printbibliography
\end{document}

然后 Sigfridsson 和 Ryde^1 展示了

style=apa,文档将显示上面的 APA 输出。

答案2

似乎在撰写此答案时,没有官方界面可用于获取有关 biblatex 所用样式的信息。(但也许这个答案的作者忽略了这一点。或者自从写完这个答案以来,情况发生了变化。)因此,为了获得这些信息,人们需要再次犯下试图诉诸可能会发生变化的内部机制的罪行。


\blx@cbxfile也许您可以通过比较替换文本/宏的扩展来获得所需的内容\ifcsstring

\documentclass{article}
\usepackage[style=vancouver, backend=biber]{biblatex}
\usepackage{etoolbox}
\newif\ifvancouverstyle
\newif\ifapastyle

\ifcsstring{blx@cbxfile}{vancouver}{%
    \vancouverstyletrue
}{%
    \vancouverstylefalse
}
\ifcsstring{blx@cbxfile}{apa}{%
    \apastyletrue
}{%
    \apastylefalse
}

\newcommand{\detectstyle}{%
  \ifvancouverstyle
    % The action if the style is "vancouver"
    This is the Vancouver style.
  \fi
  \ifapastyle
    % The action if style is "apa"
    This is APA style.
  \fi
}

\begin{document}

\title{Hello}
\author{me}
\maketitle

\detectstyle

\end{document}

另外,expl3\str_case:onF可能会引起人们的兴趣:

\begin{filecontents}{\jobname.bib}
@article{person1,
  title = {Elaborate},
  author = {Person, One and Person, Two and Person, Three},
  date = {2024},
}
}
\end{filecontents}

\documentclass{article}
\usepackage[%
  style=vancouver, 
  % style=apa, 
  backend=biber,
  maxcitenames=2,
]{biblatex}

\addbibresource{\jobname.bib}

\ExplSyntaxOn
\cs_new:Npn \biblatexstylecases { \exp_args:Nc \str_case:onF {blx@cbxfile} }
\ExplSyntaxOff

\biblatexstylecases{%
  {vancouver}{\NewDocumentCommand{\MyCommand}{m}{\citeauthor{#1}\cite{#1}}}%
  {apa}{\NewDocumentCommand{\MyCommand}{m}{\cite{#1}}}%
}{%
  \message{^^JWarning: Style in use is not in cases list, thus \string\MyCommand\space not defined!^^J}%
}%

\begin{document}

\title{Hello}
\author{me}
\maketitle

According to \MyCommand{person1} ...text...

\printbibliography[heading=bibintoc]

\end{document}

不用说,我不太喜欢这种处理问题的方式,因为定义引用命令的“官方”和更好的途径是通过\DeclareCiteCommand\renewbibmacro之类的。这也是为什么我没有提供代码来提供详细的错误消息,以防使用的样式不在案例列表中。Moewe在评论中给出了坚持使用 biblatex 包本身提供的引用命令定义方法的充分理由。在我的示例中,我没有重点介绍如何正确定义引用命令。这可以从 biblatex 手册中学到。相反,在我的回答中,重点是如何根据使用的样式实现分叉,因为在一个评论你说你认为你“真的需要它”。

相关内容