我想知道 biblatex 和 pdflatex 是否可以使用样式自动选择\cite
命令的文内外观author-year
。例如,我希望引用跟在后面in
,即in~\cite{label}...
带括号,而我希望其他引用不带括号。规则将是这样的:如果\cite{label}
跟在后面in
,则使用,\parencite
否则使用\cite
。我当然可以手动实现这一点,但我不想这样做。
\documentclass{article}
\usepackage{filecontents}
\usepackage[backend=bibtex,style=authoryear]{biblatex}
\addbibresource{database.bib}
\begin{filecontents*}{database.bib}
@article{art:article1,
title = {Title 1},
author = {Author1},
year={2018},
journal = {journal 1},
}
@article{art:article2,
title = {Title 2},
author = {Author2},
year={2018},
journal = {journal 2},
}
\end{filecontents*}
\begin{document}
As stated by~\cite{art:article1}, sky is blue. However, in~\cite{art:article2}, the author thinks that. By the way, the previous citation should look like (\cite{art:article2}).
\printbibliography
\end{document}
答案1
正如我在评论中写到的,LaTeX 宏通常不太了解它们周围的文本。使用一些巧妙的技巧,可以瞥见宏之后的内容(吸收另一个参数的简单解决方案至少会给我们下一个标记),但通常的技巧不适用于整个单词或短语。找出宏之前发生的事情就更难了。有有限的方法可以找出宏之前的标点符号,但通常没有更多。
因此,最好的选择是采用宏之外的方法\cite
,本质上类似于对文档文本进行完整的搜索和替换工作。
当然,您可以在您最喜欢的编辑器中执行此操作。这样做的好处是您可以手动检查每个事件并评估替换的有效性。
如果您坚持要求一种保持实际.tex
输入不变并且仅在 TeX 运行时发生的解决方案,我猜最好的选择是 LuaTeX 和expl3
.expl3
的 RegExp 确实令人印象深刻,但我不确定它是否旨在从本质上覆盖整个文档主体。
ALuaLaTeX解决方案可能看起来像这个答案米科的回答到 宏:替换所有出现的单词。我试图小心谨慎,只在文档开头执行过滤器,以避免替换包中的任何内容。
\documentclass[british]{article}
\usepackage[T1]{fontenc}
\usepackage[utf8]{inputenc}
\usepackage{babel}
\usepackage{csquotes}
\usepackage{luacode}
\begin{luacode}
function replace_cite (line)
return string.gsub(line, "%f[%l_]in~\\cite" , "in~\\parencite")
end
\end{luacode}
\usepackage[style=authoryear, backend=biber]{biblatex}
\addbibresource{biblatex-examples.bib}
\AtBeginDocument{%
\luadirect{
luatexbase.add_to_callback( "process_input_buffer", replace_cite, "replace_cite")}}
\begin{document}
Lorem~\cite{sigfridsson}
this is replaced: in~\cite{sigfridsson}
but not: bin~\cite{sigfridsson}
in~\cite{sigfridsson}
\printbibliography
\end{document}
我个人不太喜欢这种自动化。如果有几种可能的替代方案,文档作者应该有意识地决定她想要哪种通用引用格式(带括号、不带括号、带不同括号)。特别是如果选择依赖于上下文、取决于周围文本的结构或带有某种内涵,那么人类应该做出决定。但也许我只是试图合理化 LaTeX 宏系统的缺点。