
Следующий 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, не говоря уже о расширении репертуара типов ситуаций и репертуара зависимых от ситуации поведений команды.