banana-space / btex

MIT License
39 stars 3 forks source link

footnote reverse link #36

Closed ldXiao closed 8 months ago

ldXiao commented 8 months ago

在每处footnote调用处添加一个footnote-origin:\thefootnote的label,在printfoot处引用此label

生成效果如下

image

点击^将会返回脚标源头

abccsss commented 8 months ago

应解决以下问题:

  1. ^ 之后应带有空格。

  2. 当一个脚注有多个链接时不能正常输出。例如:

    \footnotemark\footnotemark\footnotetext{1}
    \printfootnotes
ldXiao commented 8 months ago

修改过后之后只有\footnote会产生反向链接,裸\footnotemark\footnotetext{....}不会产生反向链接

abccsss commented 8 months ago

问题:

  1. 所有 ^ 链接都指向同一个脚注。

  2. 生成的 ^ 目前是

    <span><a href="#o1"><sup>^</sup></a></span><sup style="white-space:pre-wrap"> </sup>

    应该是

    <span><a href="#o1">^</a> </span>

    注意不要使用 <sup> (否则符号过小),不必使用 \ 产生强制空格。

  3. 多个脚注同一标号的功能也应该实现,但目前不是必须的。

ldXiao commented 8 months ago

3,4已经修正

  1. 现有代码可以实现多个脚注同一标号的功能,但是正确用法是x\footnotemark ... y\footnotemark ... z\footnote{text}

然后反向链接会指向最后一处\footnote

更完善的解决方案有点费脑子,我再想想

ldXiao commented 8 months ago
\def\@footnoteoriginrefcollection{}

\def\@footnotemark{%
    \@inc{g.ctr-footnote}%
    {%
        \@settrue{text-sup}%
        \@@set{ref-key}{footnote:{g.ctr-footnote}}%
        \@ref{\thefootnote}%
        \@footnoteorigin%
        \@patch\@footnoteoriginrefcollection{\@footnoteoriginref}
    }%
    \@dec{g.ctr-footnote}%
}
......

\def\footnotetext#1{%
    \@inc{g.ctr-footnote}%
    \@footnotetext{
       \@footnoteoriginrefcollection#1
    }%
    \def\@footnoteoriginrefcollection{}
}

\pdef\@footnoteorigin{%
    \@inc{g.ctr-footnoteorigin}
    \@@def\@currentlabel{^}%
    \@@set{ref-prefix}{o}% 
    \@@bmk%
    \@@label{footnote-origin:{g.ctr-footnoteorigin}}%
}

\pdef\@footnoteoriginref{%
    {
        \@inc{g.ctr-footnoteoriginref}
        \@@set{ref-key}{footnote-origin:{g.ctr-footnoteoriginref}}%
        \@ref{\thefootnoteorigin}%
    }
}

假如能够用一个collection 把 footnoteoriginref存起来,每次\footnotemark调用\@patch\@footnoteoriginrefcollection{\@footnoteoriginref},并且在printfootnotes里面每行调用\@footnoteoriginrefcollection过程中的值就可以实现下图这样的效果

image

然而\@footnoteoriginrefcollection只能存储命令被call的时候的值,而printfootnotes在结尾也就是这些中间状态全部都丢失了

可能需要定义一个internal来存中间状态, 或者做一个\@@expand来展开一层宏, 其余的方法我暂时还没想到

当然,我还有一个更简单的方法 把所有的脚标改为一个鼠标悬浮才出现的气泡<div>,这样所有的链接就不用烦恼了

ldXiao commented 8 months ago

到这一步已经解决了多个footnotemark 各自reverse link 可以实现以下效果

image

image

每个反向链接^都会跳转到对应的footnotemark

类似的机制也可以做多处引用参考文献的反向跳转

假如你对实现的效果没有意见,那么稍微清理一下就差不多可以合并了

上一个PR导致很多细碎commit进入了main branch,我的建议是用squash merge,或者我手动做一个单一的最终commit

abccsss commented 8 months ago

需要修改的问题:

  1. 问题 4 未完全修正,需要将 <sup>^</sup> 改成 ^ (或者说明不这么做的理由)。

  2. 表格中不能正常插入脚注。例如

    \footnotemark\footnotemark
    \begin{tabular}{cc}
        1\footnotetext{first} &
        2\footnote{second}
    \end{tabular}
    
    \printfootnotes

    会把第二个脚注的文字写成 4 5 second,并产生一个编译错误。原来的版本没有此问题。

  3. 目前生成的脚注 HTML 是

    <span><a href="#f1"><sup>1</sup></a></span><sup> </sup><span id="o1"></span>

    脚注标记后面有个多余的空格 <sup> </sup>,需要去掉,以符合某些排版需求,例如脚注后面有标点时就不能有空格。

ldXiao commented 8 months ago

你现在再试一下