重新定义一些脚注功能时的扩展问题

重新定义一些脚注功能时的扩展问题

我目前正在尝试重新定义脚注、脚注标记和脚注文本命令的某些方面,以允许在不同情况下(例如在浮动中)使用这些命令,例如超链接和反向引用。现在它在大量情况下运行良好。

但是,我被困在重新定义特定命令上。这似乎是命令扩展的问题。

\documentclass[a4paper,12pt,oneside,final, DIV=12, listof=totoc, bibliography=totoc, toc=bibliography, open=right, chapterprefix=true]{scrbook}
\usepackage{lmodern} 
\usepackage[utf8]{inputenc}
\usepackage[T1]{fontenc}
\usepackage{pdfpages}
\usepackage{xspace}
\usepackage[final]{hyperref}
\usepackage{footnotehyper}
\usepackage{footnotebackref}
\usepackage{tablefootnote}
\usepackage{bookmark}
\usepackage{perpage} 
\MakePerPage{footnote} 

%
% Lot of other package not usefull
%

%%%%%%%% redefinition of "footnote" to allow cool backref (work well) %%%%%%
\let\oldfootnote\footnote

%a new counter to create an unambiguous label-tag
\newcounter{myHyperFootnoteCounter}

\makeatletter

% branch between the footnote with/without opt. argument
\renewcommand{\footnote}{\@ifnextchar[\my@OptHyperFootnote\my@HyperFootnote}

%define an new footnote without optional argument
\newcommand{\my@HyperFootnote}[1]{%
    \refstepcounter{myHyperFootnoteCounter}%
    \def\myFootnoteTag{hfn:\themyHyperFootnoteCounter}%
    \label{\myFootnoteTag}%
    \oldfootnote{\hyperref[\myFootnoteTag]{$\uparrow$}~#1}%
}

%define an new footnote with optional argument
\newcommand{\my@OptHyperFootnote}[2][plop]{%
    \refstepcounter{myHyperFootnoteCounter}%
    \def\myFootnoteTag{hfn:\themyHyperFootnoteCounter}%
    \label{\myFootnoteTag}%
    % put the optional argument to the original `footnote`
    \oldfootnote[#1]{\hyperref[\myFootnoteTag]{$\uparrow$}~#2}% 
}

\makeatother


%%%%%%%%%%%%redefinition of myHyperFootnoteCounterMARK : work partially %%%%%%
\newcounter{myHyperFootnoteCounterMARK}
\let\oldfootnotetext\footnotetext
\let\oldfootnotemark\footnotemark
%
\makeatletter
\renewcommand{\footnotetext}{\@ifnextchar[\my@OptHyperFootnotetext\my@HyperFootnotetext}
%
\newcommand{\my@HyperFootnotetext}[1]{%
\def\myFootnoteTagtext{hfu:\themyHyperFootnoteCounterMARK}%
\oldfootnotetext{\hyperref[\myFootnoteTagtext]{$\uparrow$}~#1}
}
\newcommand{\my@OptHyperFootnotetext}[2][plop]{%
\def\myFootnoteTagtextARGU{hfoi:#1}%
\def\mysave{saved@Href@A}% In theory : saved@Href@#1
\let\Hy@footnote@currentHref\mysave
\oldfootnotetext{\hyperref[\myFootnoteTagtextARGU]{$\uparrow$}~#2}
}
%
\renewcommand{\footnotemark}{\@ifnextchar[\my@OptHyperFootnotemark\my@HyperFootnotemark}
%
\newcommand{\my@HyperFootnotemark}{%
\refstepcounter{myHyperFootnoteCounterMARK}%
\def\myFootnoteTagtext{hfu:\themyHyperFootnoteCounterMARK}%
\label{\myFootnoteTagtext}%
\oldfootnotemark%
}
\newcommand{\my@OptHyperFootnotemark}[1][plop]{%
\refstepcounter{myHyperFootnoteCounterMARK}
\def\myFootnoteTagtextargu{hfoi:#1}
\def\mysave{saved@Href@A}% In theory : saved@Href@#1
\label{\myFootnoteTagtextargu}%
\oldfootnotemark \global\let\mysave\Hy@footnote@currentHref%
}
%
\makeatother

错误出现在命令的末尾。我使用 Hyperref 技巧,\global\let\mysave\Hy@footnote@currentHref在脚注标记之后和\let\Hy@footnote@currentHref\mysave脚注文本之前手动重新定义。它允许无序使用脚注标记和脚注文本,方法是重新定义脚注文本指向的脚注标记,而无需使用 hypperef 不支持的 [] 变体。

这些技巧在文本中效果很好,但我想将其推广。因此,我重新定义了 footnotemark 和 footnotetext 的 [] 变体,以使用 footnotemark 和 footnotetext 的经典版本(我没有使用 [] 变体),但使用可选参数作为 hyperref 的锚点,这允许我使用 footnotemark 和 footnotetext 手动定义 hyppereference 的标签。

如果我在命令中写一个临时参数来测试它(如\global\let\saved@Href@AHy@footnote@currentHref),该命令会很好地工作(显然,它们没有指向一个好的目标,但它有效),但是当我尝试用它来概括它时:

\def\mysave{saved@Href@#1}%
\oldfootnotemark \global\let\mysave\Hy@footnote@currentHref%

当我尝试使用 footnotemark 和 footnotetext 的 [] 变体时,它会引发多个错误。(未定义的控制序列)。

我已经通过一个简单的锚点测试了替换,例如:

\def\mysave{saved@Href@A}%
\oldfootnotemark \global\let\mysave\Hy@footnote@currentHref%

但它也不起作用。所以我猜这是一个扩展优先级问题,我尝试了经典方法:

\def\mysave{saved@Href@A}%
\oldfootnotemark% 
\expandafter\global\expandafter\let\mysave\Hy@footnote@currentHref%

但令人惊讶的是,它不起作用......并抛出多个“缺少插入的控制序列” 。我在网上查找了几个解决方案,它们看起来像我使用过的解决方案,所以我不明白为什么它不起作用。

任何帮助将不胜感激 ;)

答案1

根据 Phelype Oleinik 的评论,下面是有效的代码:


%%%%%%%% redefinition of "footnote" to allow cool backref (work well) %%%%%%
\let\oldfootnote\footnote

%a new counter to create an unambiguous label-tag
\newcounter{myHyperFootnoteCounter}

\makeatletter

% branch between the footnote with/without opt. argument
\renewcommand{\footnote}{\@ifnextchar[\my@OptHyperFootnote\my@HyperFootnote}

%define an new footnote without optional argument
\newcommand{\my@HyperFootnote}[1]{%
    \refstepcounter{myHyperFootnoteCounter}%
    \def\myFootnoteTag{hfn:\themyHyperFootnoteCounter}%
    \label{\myFootnoteTag}%
    \oldfootnote{\hyperref[\myFootnoteTag]{$\uparrow$}~#1}%
}

%define an new footnote with optional argument
\newcommand{\my@OptHyperFootnote}[2][plop]{%
    \refstepcounter{myHyperFootnoteCounter}%
    \def\myFootnoteTag{hfn:\themyHyperFootnoteCounter}%
    \label{\myFootnoteTag}%
    % put the optional argument to the original `footnote`
    \oldfootnote[#1]{\hyperref[\myFootnoteTag]{$\uparrow$}~#2}% 
}

\makeatother


%%%%%%%%%%%%redefinition of myHyperFootnoteCounterMARK : work partially %%%%%%
\newcounter{myHyperFootnoteCounterMARK}
\let\oldfootnotetext\footnotetext
\let\oldfootnotemark\footnotemark
%
\makeatletter
\renewcommand{\footnotetext}{\@ifnextchar[\my@OptHyperFootnotetext\my@HyperFootnotetext}
%
\newcommand{\my@HyperFootnotetext}[1]{%
\def\myFootnoteTagtext{hfu:\themyHyperFootnoteCounterMARK}%
\oldfootnotetext{\hyperref[\myFootnoteTagtext]{$\uparrow$}~#1}
}
\newcommand{\my@OptHyperFootnotetext}[2][plop]{%
\def\myFootnoteTagtextARGU{hfoi:#1}%
\def\mysavee{saved@Href@#1}% 
\expandafter\let\expandafter\Hy@footnote@currentHref\csname\mysavee\endcsname%
\oldfootnotetext{\hyperref[\myFootnoteTagtextARGU]{$\uparrow$}~#2}
}
%
\renewcommand{\footnotemark}{\@ifnextchar[\my@OptHyperFootnotemark\my@HyperFootnotemark}
%
\newcommand{\my@HyperFootnotemark}{%
\refstepcounter{myHyperFootnoteCounterMARK}%
\def\myFootnoteTagtext{hfu:\themyHyperFootnoteCounterMARK}%
\label{\myFootnoteTagtext}%
\oldfootnotemark%
}
\newcommand{\my@OptHyperFootnotemark}[1][plop]{%
\refstepcounter{myHyperFootnoteCounterMARK}
\def\myFootnoteTagtextargu{hfoi:#1}
\def\mysave{saved@Href:#1}%
%
\label{\myFootnoteTagtextargu}%
\oldfootnotemark \global\expandafter\let\csname\mysave\endcsname\Hy@footnote@currentHref%
}
%
\makeatother

其中脚注文本为“\expandafter\let\expandafter\Hy@footnote@currentHref\csname\mysavee\endcsname%”,脚注标记为“\oldfootnotemark \global\expandafter\let\csname\mysave\endcsname”。

代码有效(反向引用和引用有效,即使在图中也是如此)但仍然依赖于文本中的某些“步进计数器”,我正在尝试使其自动化并将在完整解决方案有效时返回;)

相关内容