Bedingte Variablen (Zähler), die in einem aus einer Figur aufgerufenen Befehl definiert sind, verhalten sich so, als ob sie vorher automatisch definiert worden wären

Bedingte Variablen (Zähler), die in einem aus einer Figur aufgerufenen Befehl definiert sind, verhalten sich so, als ob sie vorher automatisch definiert worden wären

Ich versuche gerade, einen Befehl zu verallgemeinern, der mit Fußnotenzeichen und Fußnotentext arbeitet. Dazu verwende ich einen bedingten Aufruf, der einen Zähler definiert, der zur Überprüfung vorheriger Aufrufe dient.

Ich hatte ein Problem mit der Struktur des Tests, aber es wurde in einer anderen Frage auf Stackexchange gelöst. Aber jetzt habe ich ein noch seltsameres Problem. Der bedingte Test scheint anders zu laufen, wenn die Befehle aus einer Bildunterschrift oder aus einem Text aufgerufen werden. Und ich verstehe nicht, warum.

Noch merkwürdiger ist, dass es sich unterschiedlich verhält, wenn es von einer klassischen Abbildung oder von einer Abbildung aufgerufen wird, die ffimgbox verwendet.

Hier der Testcode zur Veranschaulichung des Problems: (ich verwende tux.png zum Testen):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}

Theoretisch sollte der Aufruf von myOptHyperFootnotemark vor myOptHyperFootnotetext zur Erstellung des Zählers "counter@Href:truc" und zur Inkrementierung des Zählers "lala" führen, die hier als Test für den Aufruf dieser Funktion dienen. 0 für lala = die Erstellung des Zählers wurde nie aufgerufen und andere Zahl -> Erstellung wurde aufgerufen.

Und es funktioniert im auskommentierten Teil des Codes, der aus einem Text aufgerufen wird. Wir erhalten „BB“ im Text (was bedeutet: „Ich bin im Zuweisungsblock der Funktion“) und „AA1“ in der Fußnote (was bedeutet: Der Zähler mit diesem Namen wurde bereits zugewiesen, also bin ich im nicht zugewiesenen Block). Dies ist das gewünschte Ergebnis und es ist logisch. Dies beweist auch, dass der Test funktioniert.

Wenn man das aber in einer Abbildung macht, ist das Ergebnis nicht dasselbe (auskommentierter Teil des Codes, den man zum Testen auskommentieren muss). In einer klassischen Abbildung erhalten wir im Text "BA1" und in der Fußnote "AA1". Was beides bedeutet: an einer anderen Stelle wurde der Code zum Erstellen der Variable aufgerufen, aber nicht hier (aber wo? ...).

Das Ergebnis ist noch merkwürdiger, wenn Sie es in einer Floatrow-Umgebung aufrufen (was mein Ziel ist), da es BA0 und AA0 anzeigt, was bedeutet: „Wir haben die Zuweisungsfunktion nie aufgerufen, aber wir bestehen den Test auf die Existenz des Zählers trotzdem …“

Diese letzte Variante ist für mich sehr seltsam und ich verstehe nicht wirklich, wie das möglich sein könnte ...

Ich nehme jede Hilfe an ;)

Antwort1

Die vollständige Antwort auf diese Frage wurde von @frougon in dieser Frage gegeben: Wie lässt sich eine robuste bedingte Beschriftung erstellen, die mehrfacher Kompilierung und Abbildungen standhält?

Es ist ein bisschen technisch, aber es funktioniert (auf der Theke oder dem Etikett oder was auch immer).

Bitte melden Sie sich auf dieser Seite an, um die vollständige Antwort zu erhalten ;)

verwandte Informationen