从图形调用的命令中定义的条件变量(计数器)的行为与之前自动定义的一样

从图形调用的命令中定义的条件变量(计数器)的行为与之前自动定义的一样

我最近尝试概括一个与 footnotemark 和 footnotetext 配合使用的命令。为此,我使用一个条件调用,该调用定义了一个计数器,用作对先前调用的测试。

我在测试结构方面遇到了一些问题,但这个问题在 stackexchange 上的另一个问题中得到了解决。但现在我遇到了一个更奇怪的问题。如果命令是从图片标题或文本中调用的,条件测试的运行方式似乎会有所不同。我不明白为什么。

更奇怪的是,如果从经典图形或使用 ffimgbox 的图形调用它,它的行为会有所不同。

这里是说明问题的测试代码:(我使用 tux.png 进行测试:https://upload.wikimedia.org/wikipedia/commons/a/af/Tux.png

%%%%%%%%%%% LOT OF PACKAGES AND DEFINITIONS %%%%%%%%%%

\documentclass[a4paper,12pt,oneside,final, DIV=12, listof=totoc, bibliography=totoc, toc=bibliography, open=right, chapterprefix=true]{scrbook}

\usepackage[greek,english,french]{babel}
\usepackage{lmodern}
\usepackage[utf8]{inputenc}
\usepackage[T1]{fontenc}
\usepackage[final]{hyperref}
\usepackage{footnotehyper}
\usepackage{footnotebackref}
\usepackage{tablefootnote}
\usepackage{graphicx}
\graphicspath{ {images/} }
\usepackage[format=plain, font=small, labelfont=bf, textfont=it]{caption}
\usepackage{floatrow}
\usepackage{perpage}
\MakePerPage{footnote}
\usepackage[float=false]{scrhack}

%%%%%%%%%%% LOT OF PACKAGES AND DEFINITIONS END %%%%%%%%%%

%%%%%%%%%%% BEGENNING OF THE WORK ON FOOTNOTES %%%%%%%%%%

%%% Counter for making unique ID for the footnotemark and footnotetext without [] %%%%%%
\newcounter{myHyperFootnoteCounterMARK}
%%%%% Counter for testing in which branch of testing we go  %%%%%%
\newcounter{lalala}
%
\makeatletter

%%%%% define an new footnote with optional argument : the IF never reach the undefined case, the counter "lala" is never incrememented and "BA" is only shown in the text : i have tested diverses formulation \@ifundefined \ifcsname etc etc... %%%%%
\newcommand{\myOptHyperFootnotetext}[2][plop]{
    \def\myFootnoteTagtextARGU{hfoi:#1}
    \def\mysavee{saved@Href@#1}
    %
    \ifcsname c@counter@Href:#1\endcsname
    % CASE DEFINED
        AA\thelalala
        %
        \expandafter\let\expandafter\Hy@footnote@currentHref\csname\mysavee\endcsname%
        \footnotetext{\hyperref[\myFootnoteTagtextARGU]{$\uparrow$}~#2}%
        %   
    \else 
    % CASE UNDEFINED
        AB\stepcounter{lalala}
        %
        \expandafter\let\expandafter\Hy@footnote@currentHref\csname\mysavee\endcsname
        \footnotetext{\hyperref[\myFootnoteTagtextARGU]{$\uparrow$}~#2}
        %definition of the counter if it is undifined
        \newcounter{counter@Href:#1}
        %   
    \fi
}

\newcommand{\myOptHyperFootnotemark}[1][plop]{%
    \def\myFootnoteTagtextargu{hfoi:#1}%
    \def\mysave{saved@Href:#1}%
    %
    \ifcsname c@counter@Href:#1\endcsname
        % CASE DEFINED
        BA\thelalala
        %
        \label{\myFootnoteTagtextargu}
        \footnotemark \global\expandafter\let\csname\mysave\endcsname\Hy@footnote@currentHref%
    \else   
    % CASE UNDEFINED
        BB\stepcounter{lalala}
        \label{\myFootnoteTagtextargu}
        \footnotemark \global\expandafter\let\csname\mysave\endcsname\Hy@footnote@currentHref%  
        %definition of the counter if it is undifined
        \newcounter{counter@Href:#1}
        %
    \fi
}
%
\makeatother



%%%%%%% some package %%%%%%%
\KOMAoptions{DIV=last}

%%%%%% begin %%%%%%%
\begin{document}
%%%%%% TEST %%%%%%

\chapter{TEST}
\section{Introduction}

Texttest

%%%%%%%% uncomment this to test the code when it works outisde the figure %%%%%%%%
%\myOptHyperFootnotemark[truc] 

%%%%%%%% Uncomment to test the code in a classic figure %%%%%%%%
%\begin{figure}[h]
%\centering
%\includegraphics{Tux.png}
%\caption{A caption \myOptHyperFootnotemark[truc]}
%\label{Tux}
%\end{figure}

%%%%%%%% The code calling from the caption inside a floatrow %%%%%%%%
\begin{figure}[ht]
   \centering
   {
     \begin{floatrow}[1]
        \ffigbox[\FBwidth]{\caption[blaa]{\label{Tino} BLAAAAA \myOptHyperFootnotemark[truc]}}%
{\includegraphics{Tux.png}}.
     \end{floatrow}
   }
\end{figure}

EEEEEEEEEEEEEEEEE
EEEEEEEEEEEEEEEEE

\myOptHyperFootnotetext[truc]{A footnote}% 

\end{document}

理论上,在 myOptHyperFootnotetext 之前调用 myOptHyperFootnotemark 应该会导致创建计数器“counter@Href:truc”并增加计数器“lala”,此处用作对这些函数调用的测试。0 表示 lala = 从未调用过计数器的创建,而其他数字 -> 创建已被调用。

它在从文本调用的代码的取消注释部分中起作用。我们在文本中获得“BB”(这意味着:“我在函数的赋值块中”)和脚注中的“AA1”(这意味着:具有该名称的计数器已被分配,因此我在未分配的块中)。这就是想要的结果,而且合乎逻辑,这也证明了测试有效。

但是,如果您在图中执行相同操作,结果将有所不同(注释部分代码以取消注释以进行测试)。在经典图中,我们在文本中获得“BA1”,在脚注中获得“AA1”。两者的意思是:在另一处调用了创建变量的代码,但它不在这里(但在哪里?...)。

如果你在 floatrow 环境中调用它(这是我的目标),结果会更加奇怪,因为它显示 BA0 和 AA0,这意味着“我们从未调用过赋值函数,但我们无论如何都通过了计数器存在的测试......”

最后一种变体对我来说非常奇怪,我真的不明白这是怎么可能的......

我接受任何帮助;)

答案1

@frougon 在此问题中给出了该问题的完整答案: 如何制作一个能够抵抗多次编译和图形的强大条件标签?

虽然技术性有点强,但是确实有效(在柜台或标签上或其他任何地方)。

请报告至此页面以获得完整答案;)

相关内容