自动解决 BibTeX 大小写不匹配错误

自动解决 BibTeX 大小写不匹配错误

不幸的是,我的 BibTeX 文件已被一个程序处理,该程序将所有键都改为小写。现在我的 TeX 混合了大写和小写键。如果我引用某个内容一次用 ,\citep{CASE}然后又用\citep{case},BibTeX 会抛出错误:引用键 CASE 和大小写之间存在 BibTeX 大小写不匹配错误。

我可以重新定义citepcitet和,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}

相关内容