![使用 natbib 时修改文内引用的页码格式](https://linux22.com/image/399117/%E4%BD%BF%E7%94%A8%20natbib%20%E6%97%B6%E4%BF%AE%E6%94%B9%E6%96%87%E5%86%85%E5%BC%95%E7%94%A8%E7%9A%84%E9%A1%B5%E7%A0%81%E6%A0%BC%E5%BC%8F.png)
我使用作者年份格式的 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
字符串替换,使用来自包的命令。-
--
\StrSubstitute
xstring
在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}
结果: