![smfart 中的超链接定理](https://linux22.com/image/292364/smfart%20%E4%B8%AD%E7%9A%84%E8%B6%85%E9%93%BE%E6%8E%A5%E5%AE%9A%E7%90%86.png)
编辑:该类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
插入一个\phantomsection
before\label{bla}
可以修复此问题。另请参阅这里。
答案3
受 egreg 的观察启发,我比较了文件smfart.cls
和amsthm.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}
如果有人能解释这两行的含义,我会很高兴。