修复 JAIR 样式

修复 JAIR 样式

根据特征因子期刊排名,人工智能研究杂志(JAIR)是人工智能领域领先的开放获取期刊。不幸的是,JAIR 样式文件已有二十年历史,在尝试使用时会严重损坏。此特定错误似乎是由于依赖于的已发货样式hyperref造成的。theapajair.sty

我花了几个小时试图理解和修复这些错误,但这似乎需要比我更高的 LaTeX 黑客技能水平。要复制该问题,请添加\usepackage{hyperref}到提供的输入文件的序言中sample.tex,然后运行 ​​LaTeX、BibTeX、LaTeX;然后运行 ​​LaTeX 的下一次也是最后一次(以解决悬空引用)失败,并显示

! Undefined control sequence.  
\hyper@@link ->\let \Hy@reserved@a   
                                   \relax \@ifnextchar [{\hyper@link@ }{\hyp...  
l.65 ...d graph partitioning problems \cite{papad}  
                                                  .  

在文件中第一个\cite{}使用的位置。请注意,hyperref如果不是使用,则这些错误会消失;url或等软件包tikz可以正常工作。如果删除了书目命令,则错误也会消失。更改\bibliographystyle{theapa}为标准书目样式时也会出现类似的错误,例如short

! Use of \@year@ doesn't match its definition.
\Y@papad ->\@year@ J
                    PY
l.65 ...d graph partitioning problems \cite{papad}
                                                  .

最后,如果从文档序言中删除\usepackage{theapa},问题就会消失(除了\shortcite{}和其他theapa宏现在未定义)。我甚至尝试使用theapa.sty与随附的自定义版本不同的版本jair.sty,但这似乎会产生相同的问题。

有谁知道应该在jair.sty样式文件中做哪些更改以避免出现此问题?如果我们能找到问题所在,我很乐意编写一个补丁提交给 JAIR。如果能帮助这个由志愿者运营的期刊支持带有内部链接和参考书目文章超链接的参考书目,那就太好了,就像 Elsevier 等出版商所做的那样。

答案1

您可以通过插入包来获得一些您想要的功能,hyperref如下面的最小图所示(这些设置与 JAIR 文件夹中的 sample2e.tex 示例文件一起使用)。

\documentclass[jair,twoside,11pt,theapa]{article}
\usepackage[bookmarks=true]{hyperref}
\hypersetup{%
    bookmarks=false,    % show bookmarks bar?
    pdftitle={TeX and friends hackers manual},    % title
    pdfauthor={Yiannis Lazarides},                     % author
    pdfsubject={TeX and LaTeX},                        % subject of the document
    pdfkeywords={TeX, LaTeX, graphics, images}, % list of keywords
    colorlinks=true,       % false: boxed links; true: colored links
    linkcolor=blue,       % color of internal links
    citecolor=black,       % color of links to bibliography
    filecolor=black,        % color of file links
    urlcolor=purple,        % color of external links
    linktoc=page            % only page is linked
}
\usepackage{jair, theapa, rawfonts}

\jairheading{1}{1993}{1-15}{6/91}{9/91}
\ShortHeadings{Minimizing Conflicts: A Heuristic Repair Method}
{Minton, Philips, Johnston, \& Laird}
\firstpageno{25}

\begin{document}
\section{One}\label{sec:one}
\section{Three}
  In Section \ref{sec:one}, we referenced \ldots
\section{Four}
  Some more text.
\end{document}

但是,正如您正确指出的那样,类文件需要彻底修改才能在屏幕上查看。在印刷版中,该样式为期刊文章提供了出色的样式。我建议采用以下方法。

  1. 将基本内容复制.cls到文件中.dtx,以便您可以记录更改。
  2. 首先追求立即实现功能,无需任何参考书目和引用。
  3. 声明一个选项“oldclass”或类似选项来打开旧式文件以实现向后兼容。
  4. 确保到目前为止一切正常,没有任何错误。
  5. 将课程升级到 BiblateX,这样该课程可能还能再存活 20 年,到那时 AI 就已经足够先进,可以从此接管课程!

这种方法的优点是,您可以确保向后兼容性,并且可以以更好的方式进行渐进式改进。如果您对 LaTeX 相当熟悉,则需要 1-2 周的全职工作。

答案2

事实证明

\usepackage[implicit=false]{hyperref}

足以阻止hyperrefJAIR 样式相互干扰。即使 JAIR 的 BibTeX 样式文件被修改,urlbst支持 DOI 字段和内联超链接 URL。

根据文档,选项implicit=false可防止包重新定义某些 LaTeX 内部结构。文档中的超链接似乎也被省略了,但这对我来说并不那么重要。hyperrefimplicit=false

答案3

我在撰写 JAIR 文章时也遇到了同样的兼容性问题。事实证明,只需在序言中稍加努力,theapa就可以使其与以下代码基本兼容:hyperref

  • 加载顺序很重要:首先hyperref,然后refstyle(或者你选择的交叉引用包,可能需要加载 hyperref),最后jairtheapa。这样,我们可以启用hyperref对超链接、超链接交叉引用、书签、PDF 属性和 PDF 布局的支持:

%use this command unless it is already invoked earlier in the preamble
\makeatletter

\usepackage[implicit=true,unicode=true,
 bookmarks=true,bookmarksnumbered=true,bookmarksopen=true]
 {hyperref}
\hypersetup{
  pdftitle={my title},
  pdfauthor={my name},
  pdfsubject={my subject},
  pdfkeywords={my keywords},
  %all links are black to preserve the appearance of a printed paper
  colorlinks=true,
  allcolors=black,
  pdfpagelayout=OneColumn,
  pdfnewwindow=true,
}

\usepackage{refstyle}

%we also use the package rawfonts because this this is copied verbatim
%from the JAIR author kit (http://www.jair.org)
\usepackage{jair, theapa, rawfonts}
  • 加载这些包后,我们仍然没有对引用的超链接支持。我们必须从 重新定义一个内部命令theapa,并定义与 的引用命令等效的新命令theapa

%load this package unless you have loaded it earlier
\usepackage{ifpdf}

%only the pdflatex driver can handle hyperlinks that break across lines
%(as citations often do) so we define them only when using pdflatex
\ifpdf

  %we add hyperref support with the commands \hyper@natanchorstart and \hyper@natanchorend
  \def\@lbibitem[#1]#2{\def\BBA{\BBAA}\item[\hyper@natanchorstart{#2}\@biblabel{#1}\hyper@natanchorend]\if@filesw
        { \def\BBA{\string\BBA}%
          \def\protect##1{\string ##1\space}\immediate
          \write\@auxout{\string\bibcite{#2}{#1}}%
    \def\BBA{\BBAA}}\fi\ignorespaces}

  %load this package unless you have loaded it earlier
  \usepackage{ifthen}

  %new citation commands. Add more as needed, using the existing ones as templates
  %hyperref support is added by using the commands \hyper@natlinkstart and \hyper@natlinkend
  \newcommand{\mshortcite}[2][]{\hyper@natlinkstart{#2}\ifthenelse{\equal{#1}{}}{\shortcite{#2}}{\shortcite[#1]{#2}}\hyper@natlinkend}
  \newcommand{\mshortciteA}[2][]{\hyper@natlinkstart{#2}\ifthenelse{\equal{#1}{}}{\shortciteA{#2}}{\shortciteA[#1]{#2}}\hyper@natlinkend}
  \newcommand{\mfullciteA}[2][]{\hyper@natlinkstart{#2}\ifthenelse{\equal{#1}{}}{\fullciteA{#2}}{\fullciteA[#1]{#2}}\hyper@natlinkend}
  \newcommand{\mshortciteR}[2][]{\hyper@natlinkstart{#2}\ifthenelse{\equal{#1}{}}{\shortciteR{#2}}{\shortciteR[#1]{#2}}\hyper@natlinkend}
  \newcommand{\mciteyear}[2][]{\hyper@natlinkstart{#2}\ifthenelse{\equal{#1}{}}{\citeyear{#2}}{\citeyear[#1]{#2}}\hyper@natlinkend}
  \newcommand{\mciteyearR}[2][]{\hyper@natlinkstart{#2}\ifthenelse{\equal{#1}{}}{\citeyearR{#2}}{\citeyearR[#1]{#2}}\hyper@natlinkend}
  \newcommand{\mshortciteS}[2][]{\hyper@natlinkstart{#2}\ifthenelse{\equal{#1}{}}{\shortciteS{#2}}{\shortciteS[#1]{#2}}\hyper@natlinkend}
  \newcommand{\mshortciteauthor}[1]{\hyper@natlinkstart{#1}\shortciteauthor{#1}\hyper@natlinkend}
  \newcommand{\mfullciteauthor}[1]{\hyper@natlinkstart{#1}\fullciteauthor{#1}\hyper@natlinkend}

\else

  %default definitions when not using pdflatex
  \let\mcite\shortcite
  \let\mcitea\shortciteA
  \let\mcitear\fullciteA
  \let\mciter\shortciteR
  \let\mciteyear\citeyear
  \let\mciteyearr\citeyearR
  \let\mcites\shortciteS
  \let\mciteauthor\shortciteauthor
  \let\mciteauthorr\fullciteauthor
  \let\mcitetable\mciter

\fi

%use this command unless it is already invoked later in the preamble
\makeatother

就是这样!

在序言中使用这些代码片段将使hyperrefJAIR 文章获得几乎完全的支持。请注意,theapa新的引用命令中缺少某些功能,例如尖括号中的可选参数,或使用单个引用命令引用多个参考文献。

如果你只想使用theapawithout jair,只需替换

\usepackage{jair, theapa, rawfonts}

经过

\usepackage{theapa}

更新:我注意到,此解决方案仅适用于pdflatex,但不能用于生成 DVI->PS,因为 DVI 驱动程序无法处理跨行引用的链接。解决方案是仅对pdflatex使用启用新的引用命令ifpdf。代码已相应更新。

答案4

apacite我在同时使用package 和package时遇到了这个问题hyperref。错误消息

! Undefined control sequence.  
\hyper@@link ->\let \Hy@reserved@a   
                                   \relax \@ifnextchar [{\hyper@link@ }{\hyp...  
l.65 ...d graph partitioning problems \cite{xxxx}

事实证明我\usepackage{apacite}之前已经放过了。我之前\usepackage{hyperref}刚刚搬家,现在一切都正常了。\usepackage{hyperref}\usepackage{apacite}

相关内容