使用下一个命令来逆转 \newline 的效果?

使用下一个命令来逆转 \newline 的效果?

我正在使用harvard包和agsm参考书目样式。我知道还有其他选择,例如natbibplus 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\newlineagsm.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

相关内容