incompatibilidad de nohyperref y xifthen en situaciones específicas

incompatibilidad de nohyperref y xifthen en situaciones específicas

El siguiente MWE se compila hyperrefpero no con 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}

Cuando respondo \ifthenelse{\equal{#1}{}}, \ifblank{#1}se compila al menos pero aún con un error.

Respuesta1

Tengo la impresión de que estás utilizando la herramienta incorrecta (me refiero a \ifthenelse). De todos modos, hazte \hyperreffuerte y estarás en camino.

\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}

Respuesta2

Nunca uso el paquetenohiperref.

Para alternar entre activar/desactivar hipervínculos con el paquete hyperref, hago que TeX haga globalmente lo que normalmente se hace solo dentrohiperreferenciael medio ambiente NoHyper; También es necesario cuidar los marcadores:

\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}

Respuesta3

La prueba \ifthenelse{\equal{#1}{}}...en el ⟨texto de reemplazo⟩ de la definición de la macro \fparece pretender ser una aproximación de una prueba para determinar si el argumento representado por el parámetro #1consta de tokens, cuyo procesamiento da como resultado la creación de un área en la salida. archivo (archivo .pdf o archivo .dvi) que se puede convertir en un hipervínculo en el que se puede hacer clic.


Si lo hace \DeclareRobustCommand{\D}en lugar de \newcommand{\D}, su código se compila sin mensajes de error:

\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 solución funciona sin cargar otros paquetes y sin parchear macros existentes.

Esta solución también debería funcionar pararevistas que prohíben la hiperreferencia. ;-)



Creo que convertir un componente de una ecuación en un hipervínculo que conduce al número de esa misma ecuación podría no parecerse a un escenario de la vida real, pero su ejemplo pretende mostrar problemas relacionados con la necesidad de que el comportamiento de los comandos varíe dependiendo de la situación en la que se llevan a cabo. (En la situación de evaluar la \ifthenelseprueba, el comando \hyperrefdebe comportarse de una manera que difiere de su comportamiento en la situación de composición tipográfica y creación de hipervínculos dentro del archivo de salida (archivo .dvi/archivo .pdf).)

La prueba \ifthenelse{\equal{#1}{}}...en el ⟨texto de reemplazo⟩ de la definición de la macro \fparece pretender ser una aproximación de una prueba para determinar si el argumento representado por el parámetro #1consta de tokens, cuyo procesamiento da como resultado la creación de un área en la salida. archivo (archivo .pdf o archivo .dvi) que se puede convertir en un hipervínculo en el que se puede hacer clic.

El comando \ifthenelsedebajo de otras cosas dentro de un alcance local lo hace \let\equal\TE@equalmientras evalúa su argumento de prueba.
Este hecho se puede utilizar para bifurcar dependiendo de si actualmente se está en la situación de evaluar el argumento de prueba de una instancia de la macro \ifthenelsey en este caso omitir/eliminar tokens que no se pueden llevar a cabo/no son necesarios en este 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 ejemplo es algo excesivo. Pero ilustra cómo se podrían diseñar comandos expandibles para hacer cosas diferentes dependiendo de las situaciones en las que se expanden/ejecutan.
Desafortunadamente, no existe una "gestión de situaciones" en LaTeX donde se pueda consultar de manera confiable en cualquier momento qué tipo de situación se encuentra actualmente LaTeX, y mucho menos ampliar el repertorio de tipos de situaciones y el repertorio de comportamientos de un comando dependientes de la situación.

información relacionada