smfart 中的超链接定理

smfart 中的超链接定理

编辑:该类smfart法国数学学会用于排版数学。这是它的 CTAN 页面smflatex,它位于这是文档

简而言之,该类smfart与 结合时hyperref,无法正确链接到定理环境

这是一个最小的工作示例:

\documentclass[english]{smfart}
\usepackage[francais,english]{babel}
\usepackage{smfthm}
\usepackage{hyperref}

\begin{document}
\mainmatter

\begin{theo}\label{thetheorem}
d
\end{theo}

Consider \ref{thetheorem}

\end{document}

我通过pdflatex对文件运行两次来进行编译。第二次,您收到以下错误消息:

pdfTeX warning (dest): name{smfthm.0.1} ha
s been referenced but does not exist, replaced by a fixed one

不难检查应该链接到定理实际上链接到文档的最开始处。

这是怎么回事?有没有已知的方法可以解决这个问题?

答案1

该类smfart在加载后会改变与新定理相关的定义amsthm,特别是\@begintheorem

现在hyperref看到amsthm已加载,因此挂接并期望\@begintheorem它与包提供的内容相同,但事实并非如此。冲突随之而来。

由于smfart其他类似课程不在 CTAN 上,Heiko Oberdiek 不太可能采取行动来应对它。如果他们想hyperref在文档中提供支持,这是课程开发人员的工作。

答案2

插入一个\phantomsectionbefore\label{bla}可以修复此问题。另请参阅这里

答案3

受 egreg 的观察启发,我比较了文件smfart.clsamsthm.sty。似乎amsth.sty版本\@begintheorem中缺少了两行至关重要的内容smfart.cls,即

\global\@inlabeltrue
\everypar\dth@everypar

\@begintheorem在in的定义中添加这两行smfart.cls似乎可以解决问题。下面是修改的示例:

\def\@begintheorem#1#2[#3]{%
  \def\@theoremhead{\normalfont\the\thm@headfont
    \@ifempty{#1}{\let\thmname\@gobble}{\let\thmname\@iden}%
    \@ifempty{#2}{\let\thmnumber\@gobble}{\let\thmnumber\@iden}%
    \@ifempty{#3}{\let\thmnote\@gobble}{\let\thmnote\@iden}%
  \thm@swap\swappedhead\thmhead{#1}{#2}{#3}}%
  \sbox\@tempboxa{\@theoremhead}%
  \ifdim\wd\@tempboxa>0.7\linewidth \smf@skippttrue\fi
  \ifsmf@skippt
  \global\smf@skipptfalse
  \item [\thm@indent]%
    {\sloppy\@theoremhead\parskip\z@\@@par}%
  \nobreak\everypar{}%
  \let\thmheadnl\relax
  \else
  \item[\hskip\labelsep\thm@indent\unhbox\@tempboxa\the\thm@headpunct]%
  %%    \hskip\z@\ignorespaces
  \fi
  \@restorelabelsep
  \thmheadnl % possibly a newline.
   \global\@inlabeltrue   %the two lines 
   \everypar\dth@everypar %borrowed from amsthm
  \ignorespaces}

如果有人能解释这两行的含义,我会很高兴。

相关内容