我目前正在尝试重新定义脚注、脚注标记和脚注文本命令的某些方面,以允许在不同情况下(例如在浮动中)使用这些命令,例如超链接和反向引用。现在它在大量情况下运行良好。
但是,我被困在重新定义特定命令上。这似乎是命令扩展的问题。
\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”。
代码有效(反向引用和引用有效,即使在图中也是如此)但仍然依赖于文本中的某些“步进计数器”,我正在尝试使其自动化并将在完整解决方案有效时返回;)