\cite 可以容忍空格吗?

\cite 可以容忍空格吗?

有没有一个包提供\cite可以容忍任意空格的命令变体?也就是说,我希望能够编写类似

\cite{foo, bar, baz}

或者

\cite{
    foo, bar, baz,
    baf, bah, bam
}

没有任何不良影响。

有趣的是,它应该与其他常用的软件包(如、和)完美配合,cite并且natbibhyperref也应该工作没有那些包裹。


编辑:例子...

测试.bib:

@MISC{bar,
    author={Bar Bar},
    title={Bar},
    year={1988}
}

@MISC{foo,
    author={Foo Foo},
    title={Foo},
    year={1988}
}

测试1.tex:

\documentclass{article}
\usepackage[numbers,sort&compress]{natbib}

\begin{document}
    \cite{foo, bar }.

    \bibliographystyle{plain}
    \bibliography{test}
\end{document}

这里pdflatex test1工作正常,但bibtex test1出现以下错误:

White space in argument---line 2 of file test1.aux
 : \citation{foo,bar
 :                   }
I'm skipping whatever remains of this command

测试2.tex:

\documentclass{article}

\begin{document}
    \cite{foo, bar }.

    \bibliographystyle{plain}
    \bibliography{test}
\end{document}

再次,pdflatex test2工作正常但bibtex test2产生以下错误:

White space in argument---line 3 of file test2.aux
 : \citation{bar
 :               }
I'm skipping whatever remains of this command

测试3.tex:

\documentclass{article}
\usepackage{cite}

\begin{document}
    \cite{foo, bar }.

    \bibliographystyle{plain}
    \bibliography{test}
\end{document}

这似乎工作正常!但自然地,它也具有该软件包的所有副作用cite,并不总是与其他软件包兼容。

答案1

抱歉,我可能有点笨,但对我来说,简单的答案是:如果我使用包,它就可以工作cite。(如果使用,它可以完美地工作cite,但如果没有,它就无法工作cite;-)。)

答案2

所以我决定试一试。问题似乎出在任何空格上每个单独的条目,以及在,或结束之前}。如果你能避免在那里出现空格,那么这可能是最好的办法。

如果您真的坚持要在列表中的任何位置留有空格,那么我可以想出以下非常棘手的解决方案。

\makeatletter
\def\tok@scan#1{%
  \ifx#1\relax
    \let\tok@next\relax
  \else
    \edef\my@list{\my@list#1}%
    \let\tok@next\tok@scan
  \fi
  \tok@next
}
\newcommand{\@strip}[2]{%
  \def\my@list{}\tok@scan#2\relax\let#1\my@list}
\newcommand{\Cite}[1]{\@strip\@args{#1}\cite\@args}
\makeatother

这样你就可以编写

\Cite{  paper1  ,  paper2,  paper3  }

简短的解释是,它将\@strip接受两个参数:一个命令名称(\@args在示例中)和一些任意参数。然后它将删除参数中的所有空格并将结果存储在您提供的命令中,然后您可以将\@args其用作有效参数,例如\cite

当然,如果您使用natbib或其他包进行引用,则必须定义相应的宏,例如\Citet\Citep具有适当的接口(例如可选参数等)。

我真的希望有人能想出更好/更简单的办法。

相关内容