使用 natbib 时修改文内引用的页码格式

使用 natbib 时修改文内引用的页码格式

我使用作者年份格式的 natbib,以及自定义 .bst 文件。它按照我的需要格式化参考书目。但在我的文档文本中,我有很多这样的引文\citet[12-30]{lamport94}。它们产生了预期的输出:“Lamport (1994, 12-30)。”

我想更改括号中参数的格式,使其显示为短划线而不是连字符。也就是说,我希望输出为“Lamport (1994, 12–30)”。但我不想“手动”修改所有引文。相反,我想添加命令或修改 .bst 文件,以便可以自动将连字符转换为短划线。我该怎么做?

我的 .bst 文件中已经有一个命令,用于将给定字符串中的连字符替换为短划线。但我不知道如何更改我的 .bst 文件来修改位于或\citet命令的可选括号内的文本\citep。例如,我不知道如何使用我的 .bst 文件格式化 中的“xxx” citet[xxx]{lamport94},或者如何使用我的 .bst 文件修改 中的页面范围\citet[12-30]{lamport94}

答案1

可以修改命令以在可选命令中执行从到的citet字符串替换,使用来自包的命令。---\StrSubstitutexstring

natbib引用中,命令被构造为被调用的分支命令序列。其中一些命令很短,可以完全重新定义,而不需要源文件中的太多代码。在下面的 MWE 中,我选择了要\NAT@@citetp修改的命令,它是序列中的第三个命令(在\citet其本身和之后\NAT@citetp)。此命令只有一行,它公开了可选命令,因此可以执行字符串替换。

代码:

\documentclass[12pt]{article}
\usepackage[round]{natbib}
\usepackage{xstring}
\makeatletter
\def\NAT@@citetp[#1]{%
\StrSubstitute{#1}{-}{--}[\newdash]%
% original code: \@ifnextchar[{\@citex[#1]}{\@citex[][#1]}
\@ifnextchar[{\@citex[\newdash]}{\@citex[][\newdash]}}
\makeatother
\begin{document}

\noindent Changing\\
Lamport (1994, 12-30) into\\
\citet[12-30]{lamport94}

\begin{thebibliography}{1}
\providecommand{\natexlab}[1]{#1}
\providecommand{\url}[1]{\texttt{#1}}
\expandafter\ifx\csname urlstyle\endcsname\relax
  \providecommand{\doi}[1]{doi: #1}\else
  \providecommand{\doi}{doi: \begingroup \urlstyle{rm}\Url}\fi

\bibitem[Lamport(1994)]{lamport94}
Leslie Lamport,
\emph{\LaTeX: A Document Preparation System}.
Addison Wesley, Massachusetts,
2nd Edition,
1994.
\end{thebibliography}
\end{document}

结果:

在此处输入图片描述

对于后记,可以重新定义\NAT@cite命令(使用\renewcommand因为该命令没有\def版本):

\documentclass[12pt]{article}
\usepackage[round]{natbib}
\usepackage{xstring}
\makeatletter
\def\NAT@@citetp[#1]{%
\StrSubstitute{#1}{-}{--}[\newdash]%
\@ifnextchar[{\@citex[\newdash]}{\@citex[][\newdash]}}
\renewcommand\NAT@cite[3]{%
\ifNAT@swa\NAT@@open\if*#2*\else #2\NAT@spacechar\fi
#1\if*#3*\else\NAT@cmt\StrSubstitute{#3}{-}{--}\fi\NAT@@close\else #1\fi\endgroup}
\makeatother
\begin{document}

\noindent Changing\\
Lamport (1994, 12-30) into\\
\citet[12-30]{lamport94}

\noindent postnote: \citep[see, e.g.,][12-30]{lamport94}

\begin{thebibliography}{1}
\providecommand{\natexlab}[1]{#1}
\providecommand{\url}[1]{\texttt{#1}}
\expandafter\ifx\csname urlstyle\endcsname\relax
  \providecommand{\doi}[1]{doi: #1}\else
  \providecommand{\doi}{doi: \begingroup \urlstyle{rm}\Url}\fi

\bibitem[Lamport(1994)]{lamport94}
Leslie Lamport,
\emph{\LaTeX: A Document Preparation System}.
Addison Wesley, Massachusetts,
2nd Edition,
1994.
\end{thebibliography}
\end{document}

结果:

在此处输入图片描述

相关内容