%2C%20%D0%BE%D0%BF%D1%80%D0%B5%D0%B4%D0%B5%D0%BB%D0%B5%D0%BD%D0%BD%D0%B0%D1%8F%20%D0%B2%20%D0%BA%D0%BE%D0%BC%D0%B0%D0%BD%D0%B4%D0%B5%2C%20%D0%B2%D1%8B%D0%B7%D0%B2%D0%B0%D0%BD%D0%BD%D0%BE%D0%B9%20%D0%B8%D0%B7%20%D1%84%D0%B8%D0%B3%D1%83%D1%80%D1%8B%2C%20%D0%B2%D0%B5%D0%B4%D0%B5%D1%82%20%D1%81%D0%B5%D0%B1%D1%8F%20%D1%82%D0%B0%D0%BA%2C%20%D0%BA%D0%B0%D0%BA%20%D0%B1%D1%83%D0%B4%D1%82%D0%BE%20%D0%BE%D0%BD%D0%B0%20%D0%B1%D1%8B%D0%BB%D0%B0%20%D0%B0%D0%B2%D1%82%D0%BE%D0%BC%D0%B0%D1%82%D0%B8%D1%87%D0%B5%D1%81%D0%BA%D0%B8%20%D0%BE%D0%BF%D1%80%D0%B5%D0%B4%D0%B5%D0%BB%D0%B5%D0%BD%D0%B0%20%D1%80%D0%B0%D0%BD%D0%B5%D0%B5.png)
Недавно я попытался обобщить команду, работающую с 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}
Теоретически вызов myOptHyperFootnotemark перед myOptHyperFootnotetext должен приводить к созданию счетчика "counter@Href:truc" и увеличению счетчика "lala", которые здесь служат проверкой вызова этих функций. 0 для lala = создание счетчика никогда не вызывалось, а другое число -> создание было вызвано.
И это работает в раскомментированной части кода, вызванного из текста. Мы получаем "BB" в тексте (что означает: "Я в блоке назначения функции") и "AA1" в сноске (что означает: счетчик с таким именем уже назначен, поэтому я в неназначенном блоке). Это желаемый результат, и он логичен, это также доказывает, что тестирование работает.
Но если сделать то же самое на рисунке, результат будет не тот же (закомментированную часть кода раскомментировать для тестирования). На классическом рисунке мы получаем "BA1" в тексте и "AA1" в сноске. Оба эти значения означают: в другой точке был вызван код для создания переменной, но его здесь нет (но где? ... ).
Результат будет еще более странным, если вы вызовете его в среде floatrow (что является моей целью), поскольку он покажет BA0 и AA0, что означает: «Мы никогда не вызывали функцию присваивания, но мы в любом случае проходим проверку существования счетчика...»
Последний вариант для меня очень странный, и я не совсем понимаю, как это возможно...
Я приму любую помощь ;)
решение1
Полный ответ на этот вопрос дал @frougon в этом вопросе: Как создать надежную условную маркировку, устойчивую к многократной компиляции и рисункам?
Это немного технично, но это работает (на прилавке, на этикетке или где-то еще).
Пожалуйста, посетите эту страницу, чтобы получить полный ответ ;)