与 hyperref 兼容的框中的脚注

与 hyperref 兼容的框中的脚注

\footnote我正在尝试在基于 的水平列表(盒装)环境中实现对 的支持shortlst,并将其移植(更多更少)到expl3。 中使用的技巧shortlst取自tabularx包,如下所示:

% Code Part I
\ifx\TX@ftn\undefined
   \newtoks\TX@ftn
   \long\def\TX@ftntext#1{%
     \edef\@tempa{\the\TX@ftn\noexpand\footnotetext
                       [\the\csname c@\@mpfn\endcsname]}%
     \global\TX@ftn\expandafter{\@tempa{#1}}}%
   \long\def\TX@xftntext[#1]#2{%
     \global\TX@ftn\expandafter{\the\TX@ftn\footnotetext[#1]{#2}}}
\fi
% Code Part II
\global\TX@ftn\expandafter{\expandafter}\the\TX@ftn
% Code Part III
\let\@footnotetext\TX@ftntext\let\@xfootnotenext\TX@xftntext

我的 MWE 是:

\documentclass{article}
\usepackage{hyperref,lua-visual-debug}
\ExplSyntaxOn
\IfPackageLoadedTF { hyperref }
  {
    \legacy_if:nT { Hy@hyperfootnotes } { \typeout{hyperfootnotes=true} }
  }{ }
% copy footnote
\cs_new_eq:NN \__my_footnotetext:nn \footnotetext
\cs_new_eq:NN \__my_footnotet:n \footnote
% \NewCommandCopy \__my_footnotet:n \footnote
% Redefine
\cs_new_protected:Nn \__my_renew_footnote:
  {
    \RenewDocumentCommand \footnote { o +m }
      {
        \IfNoValueTF {##1}
           {
             %\stepcounter{footnote}
             %\footnotemark[ \int_use:c { c@footnote } ]
             \tl_gset:Ne \g_tmpa_tl
               {
                 %\exp_not:N \__my_footnotetext:nn [ \int_use:c { c@footnote } ] {##2}
                 \exp_not:N \__my_footnotet:n {##2}
               }
           }
           {
             \footnotemark[##1]
             \tl_gset:Ne \g_tmpa_tl
               {
                 \exp_not:N \__my_footnotetext:nn [##1] {##2}
               }
           }
      }
  }
% Environment
\NewDocumentEnvironment{test}{}
  {
    \group_begin:
      \lrbox{ \l_tmpa_box }
      \__my_renew_footnote:
  }
  {
      \endlrbox
    \group_end:
    \box_set_wd:Nn \l_tmpa_box { 0.75\linewidth }
    \box_use:N \l_tmpa_box
    % footnote
    \tl_if_empty:NF \g_tmpa_tl
      {
        \g_tmpa_tl
        \tl_gclear:N \g_tmpa_tl
      }
  }
\ExplSyntaxOff
\begin{document}
Test here \footnote{footnote numered 1.}
\begin{test}
This is a test \footnote{footnote numbered 2.} more text
\end{test}
\begin{test}
This is a test \footnote[5]{footnote numered 5}.
\end{test}
This is a test \footnote{footnote numbered 3.}.
\end{document}

加载超链接时,我无法将标记放在正确的位置...有什么办法可以解决这个问题吗?

第一次尝试

使用此版本,我可以得到我想要的标记和编号,但是现在我得到:

warning  (pdf backend): unreferenced destination with name 'Hfootnote.2'

所以我离开了一个...并留在了另一个:(

\documentclass{article}
\usepackage{hyperref}
\ExplSyntaxOn
\IfPackageLoadedTF { hyperref }
  {
    \legacy_if:nT { Hy@hyperfootnotes } { \typeout{hyperfootnotes=true} }
  }{ }
% copy footnote
\cs_new_eq:NN \__my_footnotetext:nn \footnotetext
% Redefine (based on https://latexref.xyz/Footnotes-in-a-table.html)
\cs_new_protected:Nn \__my_renew_footnote:
  {
    \RenewDocumentCommand \footnote { o +m }
      {
        \IfNoValueTF {##1}
           {
             \int_gset_eq:Nc \g_tmpa_int { c@footnote }
             \footnotemark
             \tl_gset:Ne \g_tmpa_tl
               {
                 \int_gincr:N \g_tmpa_int
                 \exp_not:N \__my_footnotetext:nn [ \g_tmpa_int ] {##2}
               }
           }
           {
             \footnotemark[##1]
             \tl_gset:Ne \g_tmpa_tl
               {
                 \exp_not:N \__my_footnotetext:nn [##1] {##2}
               }
           }
      }
  }
% Environment
\NewDocumentEnvironment{test}{}
  {
    \group_begin:
      \lrbox{ \l_tmpa_box }
      \__my_renew_footnote:
  }
  {
      \endlrbox
    \group_end:
    \box_set_wd:Nn \l_tmpa_box { 0.75\linewidth }
    \box_use:N \l_tmpa_box
    % footnote
    \tl_if_empty:NF \g_tmpa_tl
      {
        \g_tmpa_tl
        \tl_gclear:N \g_tmpa_tl
      }
  }
\ExplSyntaxOff
\begin{document}
Test here \footnote{footnote numered 1.}
\begin{test}
This is a test \footnote{footnote numbered 2.} more text
\end{test}
\begin{test}
This is a test \footnote[5]{footnote numered 5}.
\end{test}
This is a test \footnote{footnote numbered 3.}.
\end{document}

笔记

我将把这个留在这里作为给未来用户的提示。我最初的想法是能够支持\footnote内部框并使其兼容hyperref,最好不使用第三方包,但事情没那么简单。@cfr 提出的解决方案非常合适,只需几个条件,我们就可以得到hyperref支持,而不会出现重大问题:D

\documentclass{article}
\usepackage{hyperref}
\usepackage{footnotehyper}
\makesavenoteenv{test}
\ExplSyntaxOn
% vars
\box_new:N \l__pgl_footnote_box
\int_new:N \g__pgl_footnote_int
\seq_new:N \g__pgl_footnotes_seq
\seq_new:N \g__pgl_footnotenos_seq
\bool_new:N \l__pgl_hyper_foot_key_bool
% hyperref
\IfPackageLoadedTF { hyperref }
  {
    \legacy_if:nT { Hy@hyperfootnotes }
      {
        \typeout{hyperfootnotes=true}
        \bool_set_true:N \l__pgl_hyper_foot_key_bool
      }
  }{ }
\bool_if:NT \l__pgl_hyper_foot_key_bool
  {
    \IfPackageLoadedTF { footnotehyper }
      {
         \typeout{OK ~ hyperref ~ and ~ footnotehyper}
      }
      {
         \typeout{No ~ footnotehyper ~ load}
         \typeout{Load ~ and  ~ use  ~ \string\makesavenoteenv{test}}
         \bool_set_false:N \l__pgl_hyper_foot_key_bool
      }
  }

% copy footnote
\cs_new_protected:Nn \__my_footnotetext:nn
  {
    \footnotetext[#1]{#2}
  }
% Redefine (based on https://latexref.xyz/Footnotes-in-a-table.html)
\cs_new_protected:Nn \__my_renew_footnote:
  {
    \seq_gclear:N \g__pgl_footnotes_seq
    \seq_gclear:N \g__pgl_footnotenos_seq
    \RenewDocumentCommand \footnote { o +m }
      {
        \IfNoValueTF {##1}
          {
            \stepcounter{footnote}
            \int_gset_eq:Nc \g__pgl_footnote_int { c@footnote }
          }
          {
            \int_gset:Nn \g__pgl_footnote_int { ##1 }
          }
            \footnotemark[\g__pgl_footnote_int]
            \seq_gput_right:Nn \g__pgl_footnotes_seq  { ##2 }
            \seq_gput_right:NV \g__pgl_footnotenos_seq  \g__pgl_footnote_int
     }
  }
% Environment
\NewDocumentEnvironment{test}{}
  {
    \group_begin:
    \lrbox{ \l__pgl_footnote_box }
    \bool_if:NF \l__pgl_hyper_foot_key_bool
      {
        \__my_renew_footnote:
      }
  }
  {
    \endlrbox
    \group_end:
    \box_set_wd:Nn \l__pgl_footnote_box { 0.75\linewidth }
    \box_use:N \l__pgl_footnote_box
    % footnote
    \seq_if_empty:NF \g__pgl_footnotenos_seq
      {
        \seq_map_pairwise_function:NNN \g__pgl_footnotenos_seq \g__pgl_footnotes_seq \__my_footnotetext:nn
      }
  }
\ExplSyntaxOff
\begin{document}
Test here \footnote{footnote numbered 1.}
\begin{test}
  This is a test \footnote{footnote numbered 2.} more text\footnote{Another footnote.}
\end{test}
\begin{test}
  This is a test \footnote[5]{footnote numbered 5}.
\end{test}
This is a test \footnote{footnote numbered 4.}.
\end{document}

出去

答案1

如果我应该删除它,请告诉我。

这样可以生成您想要的标记和文本,而不会出现hyperref未定义或多重定义目标的警告。它还允许在一个框中输入多个脚注,并消除了使用标准临时变量的需要。

\documentclass{article}
% ateb: https://tex.stackexchange.com/a/700092/ i gwestiwn Pablo González L: https://tex.stackexchange.com/q/699441/
\usepackage{hyperref}
\ExplSyntaxOn
\IfPackageLoadedTF { hyperref }
{
  \legacy_if:nT { Hy@hyperfootnotes } { \typeout{hyperfootnotes=true} }
}{ }
\box_new:N \l__gpl_footnote_box
\int_new:N \g__pgl_footnote_int
\seq_new:N \g__pgl_footnotes_seq
\seq_new:N \g__pgl_footnotenos_seq
% copy footnote
\cs_new_protected:Nn \__my_footnotetext:nn {\footnotetext[#1]{#2}}
% Redefine (based on https://latexref.xyz/Footnotes-in-a-table.html)
\cs_new_protected:Nn \__my_renew_footnote:
{
  \seq_gclear:N \g__pgl_footnotes_seq
  \seq_gclear:N \g__pgl_footnotenos_seq
  \RenewDocumentCommand \footnote { o +m }
  {
    \IfNoValueTF {##1}
    {
      \stepcounter{footnote}
      \int_gset_eq:Nc \g__pgl_footnote_int { c@footnote }
    }
    {
      \int_gset:Nn \g__pgl_footnote_int { ##1 }
    }
    \footnotemark[\g__pgl_footnote_int]
    \seq_gput_right:Nn \g__pgl_footnotes_seq  { ##2 }
    \seq_gput_right:NV \g__pgl_footnotenos_seq  \g__pgl_footnote_int
  }
}
% Environment
\NewDocumentEnvironment{test}{}
{
  \group_begin:
  \lrbox{ \l__gpl_footnote_box }
  \__my_renew_footnote:
}
{
  \endlrbox
  \group_end:
  \box_set_wd:Nn \l__gpl_footnote_box { 0.75\linewidth }
  \box_use:N \l__gpl_footnote_box
  % footnote
  \seq_if_empty:NF \g__pgl_footnotenos_seq
  {
    \seq_map_pairwise_function:NNN \g__pgl_footnotenos_seq \g__pgl_footnotes_seq \__my_footnotetext:nn
  }
}
\ExplSyntaxOff
\begin{document}
Test here \footnote{footnote numbered 1.}
\begin{test}
  This is a test \footnote{footnote numbered 2.} more text\footnote{Another footnote.}
\end{test}
\begin{test}
  This is a test \footnote[5]{footnote numbered 5}.
\end{test}
This is a test \footnote{footnote numbered 4.}.
\end{document}

两个方框带有三个脚注,非方框带有两个脚注

五个脚注

相关内容