несовместимость nohyperref и xifthen в определенных ситуациях

несовместимость nohyperref и xifthen в определенных ситуациях

Следующий MWE компилируется с , hyperrefно не с nohyperref:

\documentclass{article}
\usepackage{xifthen}
\usepackage{nohyperref} %with hyperref it compiles perfectly wihtout warnings
\newcommand{\f}[1]{
\ifthenelse{\equal{#1}{}}{f}{f(#1)}
}
\newcommand{\D}{\hyperref[eq:D]{\normalcolor D}}

\begin{document}   
\begin{equation}\label{eq:D}
\f{\D}  
\end{equation}
\end{document}

Когда я заменяю \ifthenelse{\equal{#1}{}}его \ifblank{#1}, он хотя бы компилируется, но все равно с ошибкой.

решение1

У меня сложилось впечатление, что вы используете не тот инструмент (я имею в виду \ifthenelse). В любом случае, сделайте его \hyperrefпрочным, и вы будете на своем пути.

\documentclass{article}
\usepackage{xifthen}
\usepackage{nohyperref} %with hyperref it compiles perfectly wihtout warnings

\MakeRobust{\hyperref}

\newcommand{\f}[1]{%
  \ifthenelse{\equal{#1}{}}{f}{f(#1)}%
}
\newcommand{\D}{\hyperref[eq:D]{\normalcolor D}}

\begin{document}

\begin{equation}\label{eq:D}
\f{\D}
\end{equation}

\end{document}

решение2

Я никогда не использую этот пакет.нетгиперреф.

Для переключения между включением/выключением гиперссылок с помощью пакета hyperref я заставил TeX сделать глобально то, что обычно делается только внутригиперрефсреда NoHyper; закладки также требуют внимания:

\documentclass{article}
\usepackage{xifthen}

%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
%% For turning off hyperlinks activate,                                               %
%% for turning on hyperlinks turn into a comment                                      %                             
%% the following line:                                                                %
\PassOptionsToPackage{bookmarks=false}{hyperref}\newcommand\ProbablySwitchOffHyperlinks{\NoHyper}%
%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
\usepackage{hyperref}
\providecommand\ProbablySwitchOffHyperlinks{}%
\ProbablySwitchOffHyperlinks
%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%

\newcommand{\f}[1]{\ifthenelse{\equal{#1}{}}{f}{f(#1)}}
\newcommand{\D}{\hyperref[eq:D]{\normalcolor D}}

\begin{document}
\tableofcontents
\section{bla}
\section{blu}
\begin{equation}\label{eq:D}
\f{\D}  
\end{equation}
\end{document}

решение3

Тест \ifthenelse{\equal{#1}{}}...в ⟨тексте замены⟩ определения макроса, \fпо-видимому, призван быть приближением теста на то, #1состоит ли аргумент, представленный параметром, из токенов, обработка которых приводит к созданию области в выходном файле (файле .pdf или .dvi), которую можно превратить в активную гиперссылку.


\DeclareRobustCommand{\D}Если вместо этого сделать \newcommand{\D}, то ваш код скомпилируется без сообщений об ошибках:

\documentclass{article}
\usepackage{xifthen}
\usepackage{nohyperref} %with hyperref it compiles perfectly wihtout warnings
\newcommand{\f}[1]{%
  \ifthenelse{\equal{#1}{}}{f}{f(#1)}%
}
\DeclareRobustCommand{\D}{\hyperref[eq:D]{\normalcolor D}}

\begin{document}   
\begin{equation}\label{eq:D}
\f{\D}  
\end{equation}
\begin{equation}\label{eq:empty}
\f{}  
\end{equation}
\end{document}

Это решение работает без загрузки других пакетов и без исправления существующих макросов.

Это решение также должно работать дляжурналы, запрещающие гиперссылки. ;-)



Я думаю, что превращение компонента уравнения в гиперссылку, ведущую к номеру того же уравнения, может не походить на реальный сценарий, но ваш пример призван продемонстрировать проблемы, связанные с необходимостью изменения поведения команд в зависимости от ситуации, в которой они выполняются. (В то время как в ситуации оценки -теста \ifthenelseкоманда \hyperrefдолжна вести себя способом, который отличается от ее поведения в ситуации набора текста и создания гиперссылок в выходном файле (.dvi-файл/.pdf-файл).)

Тест \ifthenelse{\equal{#1}{}}...в ⟨тексте замены⟩ определения макроса, \fпо-видимому, призван быть приближением теста на то, #1состоит ли аргумент, представленный параметром, из токенов, обработка которых приводит к созданию области в выходном файле (файле .pdf или .dvi), которую можно превратить в активную гиперссылку.

Команда \ifthenelseпод другими вещами в локальной области видимости делает \let\equal\TE@equalво время оценки своего тестового аргумента.
Этот факт может быть использован для разветвления в зависимости от того, находится ли в данный момент в ситуации оценки тестового аргумента экземпляра макроса \ifthenelseи в этом случае пропуска/удаления токенов, которые не могут быть выполнены/не нужны в этом случае:

\documentclass{article}
\usepackage{xifthen, xcolor}
\usepackage{nohyperref}

\makeatletter
\newcommand\CheckWhetherCurrentlyEvaluatingIfthenelseTest{%
  \ifx\equal\TE@equal\expandafter\@firstoftwo\else\expandafter\@secondoftwo\fi
}%
\newcommand{\D}{%
  \CheckWhetherCurrentlyEvaluatingIfthenelseTest{\@firstofone}{\hyperref[eq:D]}%
  {\CheckWhetherCurrentlyEvaluatingIfthenelseTest{}{\normalcolor}D}%
}%
\makeatother

\newcommand{\f}[1]{\ifthenelse{\equal{#1}{}}{f}{f(#1)}}

\begin{document}
\color{blue}
\tableofcontents
\section{bla}
\section{blu}
\begin{equation}\label{eq:D}
\f{\D}  
\end{equation}
\begin{equation}\label{eq:empty}
\f{}  
\end{equation}
\end{document}

Этот пример несколько излишен. Но он иллюстрирует, как можно разработать расширяемые команды для выполнения разных действий в зависимости от ситуаций, в которых они расширяются/выполняются.
К сожалению, в LaTeX нет «управления ситуациями», где вы могли бы в любое время надежно запросить, в какой ситуации в данный момент находится LaTeX, не говоря уже о расширении репертуара типов ситуаций и репертуара зависимых от ситуации поведений команды.

Связанный контент