我正在使用harvard
包和agsm
参考书目样式。我知道还有其他选择,例如natbib
plus har2nat
,我将在不久的将来研究这些选择,但目前我只是试图整理我已经拥有的参考书目。
当 bibtex 文件中的条目包含 URL 字段时,它将使用 包含在文档中的参考书目条目中\newline\harvardurl{...}
,例如:
\harvarditem[Baader et~al.]{Baader, Calvanese, McGuinness, Nardi \harvardand\
Patel-Schneider}{2003}{DLH:2003}
Baader, F., Calvanese, D., McGuinness, D.~L., Nardi, D. \harvardand\
Patel-Schneider, P.~F., eds \harvardyearleft 2003\harvardyearright , {\em
The Description Logic Handbook: Theory, Implementation and Applications},
Cambridge University Press, New York, NY, USA.
\newline\harvardurl{http://dx.doi.org/10.2277/0521781760}
现在,我经常重新定义\harvardurl
命令以便以不同的方式格式化 URL。现在我想从参考书目中完全删除所有 URL。我可以从文件中删除所有匹配的行\newline\harvardurl{...}
,但每次运行.bbl
后我都必须这样做。实际上是通过插入:bibtex
\newline
agsm.bst
FUNCTION {write.url}
{ URL empty$
{ skip$ }
{ "\newline\harvardurl{" URL * "}" * write$ newline$ }
if$
}
看来我能避免的唯一方法\newline
是通过URL
某种方式使其为空。那么,作为快速解决方法,我是否可以对 的定义做些什么\harvardurl
来消除 的影响\newline
?
作为不需要包的最小示例,这里有一个包含两个条目和一个harvard
的列表:\newline\harvardurl{...}
\documentclass{article}
% Don't display the URL text. How
% can we also counteract the previous
% \newline?
\newcommand{\harvardurl}[1]{}
\begin{document}
\begin{list}{}{}
\item Baader, F., Calvanese, D., McGuinness, D.~L., Nardi, D. \&
Patel-Schneider, P.~F., eds (2003) , {\em The Description Logic
Handbook: Theory, Implementation and Applications}, Cambridge
University Press, New York, NY, USA.
\newline\harvardurl{http://dx.doi.org/10.2277/0521781760}
\item Baader, F., Calvanese, D., McGuinness, D.~L., Nardi, D. \&
Patel-Schneider, P.~F., eds (2003) , {\em The Description Logic
Handbook: Theory, Implementation and Applications}, Cambridge
University Press, New York, NY, USA.
\newline\harvardurl{http://dx.doi.org/10.2277/0521781760}
\end{list}
\end{document}
产生最初可接受结果的快速方法是定义为\\[-2\baselineskip]
,但这感觉很不寻常:
\newcommand{\harvardurl}[1]{\\[-2\baselineskip]}
看起来还不错,至少一开始是这样;但我不确定这是否不存在导致事情发生故障的极端情况。
答案1
\newline
在水平模式下使用时(这里的情况),最终效果是发出
\nobreak\hfil\break
由于\nobreak
和分别\break
是\penalty10000
和\penalty-10000
,你应该能够通过以下方式删除这三个项目
\renewcommand{\harvardurl}[1]{\unpenalty\unskip\unpenalty}
至少这在您给出的例子中是有效的。
如何找到 的效果\newline
?有几种方法。以下是我做的。我从终端对这个未完成的文件运行 LaTeX
\documentclass{article}
\usepackage{xpatch}
\begin{document}
\makeatletter
\show\newline
这将打开一个互动环节;第一个答案是
> \newline=macro:
->\protect \newline .
l.5 \show\newline
我按下回车键,在提示符下输入
\xshowcmd\newline
因为答案清楚地表明这\newline
是一个强有力的命令;答案是
> \newline =\long macro:
->\@normalcr \relax .
<recently read> \newline
然后再返回\show\@normalcr
,得到
> \@normalcr=\long macro:
->\let \reserved@e \relax \let \reserved@f \relax \@ifstar {\let \reserved@e
\vadjust \let \reserved@f \nobreak \@xnewline }\@xnewline .
<*> \show\@normalcr
好的,\@normalcr
寻找*
,但我们没有。无论如何,我们要查看的下一个命令是\@xnewline
;因此\show\@xnewline
给出
> \@xnewline=macro:
->\@ifnextchar [\@newline {\@gnewline \relax }.
<*> \show\@xnewline
很好;我们没有[
,所以我做了\show\@gnewline
:
> \@gnewline=macro:
#1->\ifvmode \@nolnerr \else \unskip \reserved@e {\reserved@f #1}\nobreak \hfil
\break \fi .
<*> \show\@gnewline
这有点复杂,但我们不是垂直模式,所以 LaTeX 执行
\unskip\reserved@e{\reserved@f\relax}\nobreak\hfil\break
现在我们回过头来看看\reserved@e
和是如何\reserved@f
被定义的\@normalcr
:没什么奇怪的,它们是\relax
。因此,效果是删除一个空格\unskip
(这对我们的目的有好处)并插入
\nobreak\hfil\break
命令\unpenalty
和\unskip
是 TeX 基元,您可以在 TeXbook 或 TeX by Topic ( ) 中找到描述texdoc texbytopic
。基本上,\unpenalty
如果最后一项是惩罚项,则删除最后一项;\unskip
如果最后一项是跳过项,则删除最后一项。使用 TeX 的拟议重新定义,\harvardurl
剩下
\nobreak\hfil\break\unpenalty\unskip\unpenalty
实际上它已经执行了前三个命令,将一个惩罚项、一个粘合项和另一个惩罚项附加到当前列表中;因此,第一个命令\unpenalty
由于 而删除了惩罚,然后最后一个项是被 删除的\break
结果,然后列表中的最后一项再次是一个惩罚:好极了,摆脱了它。\hfil
\unskip
\unpenalty