不幸的是,我的 BibTeX 文件已被一个程序处理,该程序将所有键都改为小写。现在我的 TeX 混合了大写和小写键。如果我引用某个内容一次用 ,\citep{CASE}
然后又用\citep{case}
,BibTeX 会抛出错误:引用键 CASE 和大小写之间存在 BibTeX 大小写不匹配错误。
我可以重新定义citep
、citet
和,citealt
在调用它之前先将所有内容转换为小写,以便大写或小写都可以起作用吗?
答案1
我可以重新定义
\citep
、、\citet
并\citealt
首先将所有内容转换为小写……吗?
如果必须这样做,最好采用预处理器方法。为什么?natbib
的引用宏(\citet
、、等)可以采用一个或\citep
两个\citealt
选修的参数。修改此类宏的行为可能容易出错。
在预处理器方法中,参数所有\cite
类型的宏都会被即时转换为全小写字母,前TeX 开始正常工作。如果使用 LuaLaTeX 并设置一个合适的 Lua 函数并将其分配给process_input_buffer
回调,这种方法是可行的。(此回调在非常早期的阶段运行,即作为预处理器。)以下示例代码实现了这个想法。
% !TEX TS-program = lualatex
%% Create a bib file with two sample entries
\RequirePackage{filecontents}
\begin{filecontents*}{mybib.bib}
@misc{aa:3001,
author = "Anne Author",
title = "Thoughts",
year = 3001,
}
@misc{aazz:3002,
author = "Anne Author and Zelda Zwicky",
title = "Further Thoughts",
year = 3002,
}
\end{filecontents*}
\documentclass{article}
\usepackage{luacode} % for 'luacode' environment
\begin{luacode}
-- The function 'lowercase_cite' does the heavy lifting:
function lowercase_cite ( s )
return ( s:gsub ( "(\\[cC]ite.-)(%b{})" ,
function (a,b) return (a..string.lower(b)) end ) )
end
\end{luacode}
%% Assign 'lowercase_cite' to LuaTeX's 'process_input_buffer' callback
\AtBeginDocument{\directlua{luatexbase.add_to_callback (
"process_input_buffer" , lowercase_cite , "lowercase_cite" )}}
%% Load 'natbib' package and select a suitable bibliography style
\usepackage[round,authoryear]{natbib}
\bibliographystyle{plainnat}
\begin{document}
\citet {aa:3001}; \citep{aazz:3002}
\cite {Aa:3001}; \citep {aAZz:3002}
\citealt {AA:3001}; \citealp{AazZ:3002}
\bibliography{mybib}
\end{document}