
O seguinte MWE é compilado com, hyperref
mas não com 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}
Quando eu substituo, \ifthenelse{\equal{#1}{}}
ele \ifblank{#1}
compila pelo menos, mas ainda com um erro.
Responder1
Tenho a impressão de que você está usando a ferramenta errada (estou me referindo a \ifthenelse
). De qualquer forma, torne-se \hyperref
robusto e você estará no caminho certo.
\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}
Responder2
Eu nunca uso o pacotesem hiperref.
Para alternar entre ativar/desativar hiperlinks com o pacote hyperref, faço com que o TeX faça globalmente o que normalmente é feito apenas dentrohiperrefambiente NoHyper
; os marcadores também precisam ser cuidados:
\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}
Responder3
O teste \ifthenelse{\equal{#1}{}}...
no ⟨texto de substituição⟩ da definição da macro \f
parece pretender ser uma aproximação de um teste para saber se o argumento representado pelo parâmetro #1
consiste em tokens, cujo processamento resulta na criação de uma área na saída arquivo (arquivo .pdf ou arquivo .dvi) que pode ser transformado em um hiperlink clicável.
Se você fizer isso \DeclareRobustCommand{\D}
em vez de \newcommand{\D}
, seu código será compilado sem mensagens de erro:
\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}
Esta solução funciona sem carregar outros pacotes e sem corrigir macros existentes.
Esta solução também deve funcionar pararevistas que proíbem hyperref. ;-)
Acho que transformar um componente de uma equação em um hiperlink que leva ao número dessa mesma equação pode não se parecer com um cenário da vida real, mas seu exemplo pretende exibir problemas relacionados à necessidade de fazer com que o comportamento dos comandos varie dependendo da situação em que eles são realizados. (Enquanto na situação de avaliação do \ifthenelse
-test o comando \hyperref
deve se comportar de uma maneira que difere de seu comportamento quando na situação de composição tipográfica e criação de hiperlinks dentro do arquivo de saída (arquivo .dvi/arquivo .pdf).)
O teste \ifthenelse{\equal{#1}{}}...
no ⟨texto de substituição⟩ da definição da macro \f
parece pretender ser uma aproximação de um teste para saber se o argumento representado pelo parâmetro #1
consiste em tokens, cujo processamento resulta na criação de uma área na saída arquivo (arquivo .pdf ou arquivo .dvi) que pode ser transformado em um hiperlink clicável.
O comando \ifthenelse
abaixo de outras coisas dentro de um escopo local faz \let\equal\TE@equal
ao avaliar seu argumento de teste.
Este fato pode ser usado para bifurcação dependendo se atualmente está na situação de avaliar o argumento de teste de uma instância da macro \ifthenelse
e neste caso omitir/remover tokens que não podem ser executados/não são necessários neste caso:
\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}
Este exemplo é um tanto exagerado. Mas ilustra como comandos expansíveis podem ser projetados para fazer coisas diferentes dependendo das situações em que são expandidos/executados.
Infelizmente, não existe um "gerenciamento de situação" no LaTeX onde você possa consultar com segurança a qualquer momento em que tipo de situação o LaTeX está atualmente, e muito menos estender o repertório de tipos de situação e o repertório de comportamentos dependentes da situação de um comando.