如何查看并测试下一个字符是否是数字?

如何查看并测试下一个字符是否是数字?

背景故事:《函数式编程杂志》它有自己的 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。

相关内容