有没有一个包提供\cite
可以容忍任意空格的命令变体?也就是说,我希望能够编写类似
\cite{foo, bar, baz}
或者
\cite{
foo, bar, baz,
baf, bah, bam
}
没有任何不良影响。
有趣的是,它应该与其他常用的软件包(如、和)完美配合,cite
并且natbib
它hyperref
也应该工作没有那些包裹。
编辑:例子...
测试.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
具有适当的接口(例如可选参数等)。
我真的希望有人能想出更好/更简单的办法。