\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}