背景故事:《函数式编程杂志》它有自己的 LaTeX 类我们希望使用\citet
(如natbib
)。不幸的是,类文件与不兼容natbib
,他们没有提供biblatex
(实现该natbib
模式)的样式文件。简而言之,我想要一个魔法jfphack.sty
,以便以下 LaTeX 文档产生“Apple & Orange (9999)”。
\RequirePackage{amsmath}
\documentclass{jfp1}
\usepackage{filecontents}
\usepackage{jfphack}
\title{}
\author{}
\affil{}
\email{}
\begin{document}
\citet{test1} % want "Apple & Orange (9999)"
\bibliographystyle{jfp}
\bibliography{test}
\begin{filecontents}{test.bib}
@article{test1,
title={Secret of the {U}niverse},
author={Angry Apple and Outraged Orange},
journal={nowhere},
year={9999}
}
\end{filecontents}
\end{document}
编辑:我想出了以下 hack.sty
文件并更新了问题。总的来说,除了\@addendparen
(和\@ifnextdigit
) 之外,我都很高兴。有没有办法简化它们?
\NeedsTeXFormat{LaTeX2e}
\ProvidesPackage{jfphack}
\def\@ifnextdigit#1#2{%
\@ifnextchar0{#1}%
{\@ifnextchar1{#1}%
{\@ifnextchar2{#1}%
{\@ifnextchar3{#1}%
{\@ifnextchar4{#1}%
{\@ifnextchar5{#1}%
{\@ifnextchar6{#1}%
{\@ifnextchar7{#1}%
{\@ifnextchar8{#1}%
{\@ifnextchar9{#1}%
{#2}}}}}}}}}}}
\def\@addendparenx#1{#1\@addendparen}
\def\@addendparen{\@ifnextdigit{\@addendparenx})}
\def\@removeendcomma#1, {#1}
\newif\if@outerparen \@outerparentrue
\def\@cite#1#2{\if@tempswa#2\else\if@outerparen(#1)\else#1\fi\fi\@outerparentrue}
\def\citet{\@outerparenfalse\def\citename##1{\@removeendcomma##1 (\@addendparen}\@internalcite}
\let\citep\cite
\let\citeyearpar\shortcite
答案1
收到的引用格式为
\citename{Apple \& Orange, }9999
\citename
因此,必要时需要重新定义。
\begin{filecontents*}{\jobname.bib}
@article{test1,
title={Secret of the {U}niverse},
author={Angry Apple and Outraged Orange},
journal={nowhere},
year={9999}
}
\end{filecontents*}
\RequirePackage{amsmath}
\documentclass{jfp}
\usepackage{filecontents}
%\usepackage{jfphack}
\usepackage{xpatch}
\makeatletter
\newif\if@citet
\let\citet\cite
\xpretocmd{\cite}{\@citetfalse}{}{}
\xpretocmd{\citet}{\@citettrue}{}{}
\newcommand{\citetcitename}[1]{%
\citet@removecomma#1\@nil
\afterassignment\citet@year\count@
}
\def\citet@year{(\the\count@)}
\def\@cite#1#2{%
\if@tempswa
#2%
\else
\if@citet
\begingroup
\let\citename\citetcitename
#1%
\endgroup
\else
(#1)%
\fi
\fi
}
\def\citet@removecomma#1, \@nil{#1~}
\makeatother
\title{}
\author{}
\affil{}
\email{}
\begin{document}
\cite{test1} % want "Apple & Orange (9999)"
\citet{test1}
\bibliographystyle{jfp}
\bibliography{\jobname}
\end{document}
假设年份是现在的。
答案2
您可以使用 futurelet 大大简化@ifnextdigit
\def\@ifnextdigit#1{\def\@doit{#1}\futurelet\next\@finish}
\def\@finish{\ifcat3\next\expandafter\@doit\fi}
要使用它,你需要将找到数字后要执行的任何命令作为 @ifnextdigit 的参数。然后将其存储在 \@doit 中。然后我们使用 futurelet 查看此宏展开后的下一个标记,并将其存储在 \next 中。然后我们使用 ifcat 测试检查它是否具有数字的类别代码,如果有,则执行 \@doit。