我正在制作一份新文档,但我遇到的问题是,我仍然不知道在提交时需要什么参考书目样式。它可能是温哥华样式或 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=apa
biblatex
我的想法如下
\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 格式您可以获得
如果你将其style=apa
更改style=vancouver
为
\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}
此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 手册中学到。相反,在我的回答中,重点是如何根据使用的样式实现分叉,因为在一个评论你说你认为你“真的需要它”。